我正在玩signal.h
和unistd.h
库,我遇到了一些问题。在下面的代码中,当我通过调用SIGINT
将CTRL-C
信号发送到正在运行的程序时,信号被捕获。但是,再次按CTRL-C
时,程序将终止。据我了解,每次按"Received signal 2"
时都应打印打印语句CTRL-C
。
我对此信号的理解是否不正确,或者我的代码中是否有错误?
感谢您的投入!
#include "handle_signals.h"
void sig_handler(int signum)
{
printf("\nReceived signal %d\n", signum);
}
int main()
{
signal(SIGINT, sig_handler);
while(1)
{
sleep(1);
}
return 0;
}
终端输出:
xxx@ubuntu:~/Dropbox/xxx/handle_signals$ ./handle_signals
^C
Received signal 2
^C
xxx@ubuntu:~/Dropbox/xxx/handle_signals$
编辑:这是我收录的标题
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void sig_handler(int signum);
感谢您的回复。现在阅读它们!
答案 0 :(得分:4)
请勿使用signal
,请使用sigaction
:
signal()的行为在UNIX版本中各不相同,并且在不同版本的Linux上也有不同的历史变化。 避免使用:改为使用sigaction(2)。
http://man7.org/linux/man-pages/man2/signal.2.html
在原始UNIX系统中,当使用signal()建立的处理程序通过传递信号来调用时,信号的处置将重置为SIG_DFL,并且系统不会阻止其他实例的传递。信号。
Linux实现了相同的语义:处理程序在传递信号时被重置。
答案 1 :(得分:2)
signal
在收到第一个信号时的行为因实施不同而异。通常,它需要在接收到信号后重新安装处理程序,因为处理程序已重置为其默认操作:
void sig_handler(int signum)
{
signal(SIGINT, sig_handler);
printf("\nReceived signal %d\n", signum);
}
这是您不应再使用signal
并使用sigaction
的原因之一。你可以在这里看到using sigaction的裸骨示例。