我已经开始在Linux中接收信号了,但是我的代码中发生了一些奇怪的行为。我刚刚开始,我也搜索了它,但我没有找到任何东西,对不起,如果问题太蹩脚,这里是代码 -
void Handler(int sig ){
printf("Inside Handler\n");
}
int main(int argc, char * argv[], char * envp[]){
if( signal(SIGINT, Handler) ==SIG_ERR )
exit(EXIT_FAILURE);
for(size_t i = 0; ; i++){
printf("%d\n", i);
sleep(2);
}
}
我知道printf
,signal
来电并不是一个好主意,但到目前为止我还没有研究sigaction
。现在根据我的书和其他教程,如果我按ctrl+c
,那么每次都要调用Handler
,但这是奇怪的事情:当我按ctrl+c
一次时,它正在调用{{ 1}}但下次它终止程序。为什么会发生这种奇怪的事情?
答案 0 :(得分:1)
signal
系统调用的手册页说:
如果信号符号传递给进程,则会发生以下情况之一:
如果处置设置为SIG_IGN,则忽略该信号。
如果处置设置为SIG_DFL,则会发生与信号关联的默认操作(请参阅signal(7))。
如果处置设置为函数,则首先将处置重置为SIG_DFL,或者阻止信号(请参阅下面的可移植性),然后处理程序是用参数signum调用。如果调用处理程序导致信号被阻止,那么从处理程序返回时信号将被解除阻塞。
由于SIGINT的默认行为是在信号重置为默认行为后终止,因此后续行为不同。
答案 1 :(得分:0)
传递signal
或SIG_DFL
以外的处理程序时SIG_IGN
的行为未定义。为此目的使用sigaction
。
正如docs所说:
signal()的唯一可移植用途是将信号的处置设置为
SIG_DFL
或SIG_IGN
。使用signal()建立信号处理程序时的语义因系统而异(而POSIX.1明确允许这种变化);不要将它用于此目的。
答案 2 :(得分:0)
以下是我在您的帮助下编写的代码,该代码工作正常,我相信这将在每个平台上都能很好地工作
#define _GNU_SOURCE
void Handler(int sig ){
printf("Inside Handler\n");
}
int main(int argc, char *argv[], char *envp[] ){
sighandler_t Action =Handler;
if( Action == SIG_DFL ){
Action = Handler;
}
if( signal(SIGINT, Action ) == SIG_ERR )
exit(EXIT_FAILURE );
for(size_t k = 0 ; ; k++ ){
printf("%d\n", k );
sleep(2);
}
}