在我退出之前处理 sigaction 时我的 printf 没有出现
my printf isnt showing up when handling sigaction until i exit
我是 Unix 信号的新手,这个练习的目的是禁用 SIGINT 来停止程序并改用 SIGQUIT,当我按下 ctrl-c 时它成功地忽略了 SIGINT 但 printf 直到我才显示按下 SIGQUIT 对应的 Ctrl-/,所有消息立即出现。
示例:如果我按 ctrl-c 4 次,然后按 ctrl-/:
仅在按下 ctrl-\ 后,我收到 4 条消息说我按下了 Ctrl-c 然后退出,您发送了 SIGQUIT 信号。
如果我只按 ctrl-c,我什么也得不到,但至少它被忽略了
struct sigaction action;
void hand(int sig)
{
switch(sig){
case SIGINT:
printf("You have presed ctrl-c");
break;
case SIGQUIT:
printf("Quittin you sent a SIGQUIT signal");
exit(SIGQUIT);
break;
default:
printf("WRONG SIGNAL");
exit(-1);
break;
}
}
int main()
{
action.sa_handler=hand;
printf("Ctrl-C disabled, press Ctrl-/ to quit...\n");
sigaction(SIGINT,&action,NULL);
sigaction(SIGQUIT,&action,NULL);
while(1){
sleep(1);
}
}
这里有两个问题。首先,printf
默认情况下是行缓冲的,并且您没有打印换行符,因此输出缓冲区可能不会在您期望的时候被刷新。其次,printf
函数 不是 异步信号安全的,这意味着在信号处理程序中调用它是未定义的行为。
更改您的信号处理程序以设置标志而不是打印,然后在循环中检查该标志并打印(在字符串末尾带有 \n
)如果已设置。
除了@dbush 的回答,您还可以使用write
in the signal handler, it is async-signal-safe 并且没有缓冲会延迟其输出。
示例:
static char const msg[] = "You have presed ctrl-c\n";
write(STDOUT_FILENO, msg, sizeof msg - 1);
我是 Unix 信号的新手,这个练习的目的是禁用 SIGINT 来停止程序并改用 SIGQUIT,当我按下 ctrl-c 时它成功地忽略了 SIGINT 但 printf 直到我才显示按下 SIGQUIT 对应的 Ctrl-/,所有消息立即出现。
示例:如果我按 ctrl-c 4 次,然后按 ctrl-/: 仅在按下 ctrl-\ 后,我收到 4 条消息说我按下了 Ctrl-c 然后退出,您发送了 SIGQUIT 信号。
如果我只按 ctrl-c,我什么也得不到,但至少它被忽略了
struct sigaction action;
void hand(int sig)
{
switch(sig){
case SIGINT:
printf("You have presed ctrl-c");
break;
case SIGQUIT:
printf("Quittin you sent a SIGQUIT signal");
exit(SIGQUIT);
break;
default:
printf("WRONG SIGNAL");
exit(-1);
break;
}
}
int main()
{
action.sa_handler=hand;
printf("Ctrl-C disabled, press Ctrl-/ to quit...\n");
sigaction(SIGINT,&action,NULL);
sigaction(SIGQUIT,&action,NULL);
while(1){
sleep(1);
}
}
这里有两个问题。首先,printf
默认情况下是行缓冲的,并且您没有打印换行符,因此输出缓冲区可能不会在您期望的时候被刷新。其次,printf
函数 不是 异步信号安全的,这意味着在信号处理程序中调用它是未定义的行为。
更改您的信号处理程序以设置标志而不是打印,然后在循环中检查该标志并打印(在字符串末尾带有 \n
)如果已设置。
除了@dbush 的回答,您还可以使用write
in the signal handler, it is async-signal-safe 并且没有缓冲会延迟其输出。
示例:
static char const msg[] = "You have presed ctrl-c\n";
write(STDOUT_FILENO, msg, sizeof msg - 1);