信号函数(SIGINT)是什么?

20

这个下面的语句是做什么用的?如果有人能解释一下这个函数,我会非常感激。

signal(SIGINT, SIG_DFL);

9
你有没有读过手册页? - Kiril Kirov
4个回答

12

SIGINT 是中断信号,当您按下 Ctrl+C 时会触发。它的默认行为是终止进程。可以对 SIGINT 信号进行处理,这意味着可以更改默认行为(通过调用 sighandler 或将其设置为 SIG_IGN)。

现在,一旦更改了操作并且您想要再次设置此信号的默认行为,则应编写

signal(SIGINT, SIG_DFL);

它将再次更改信号的默认行为(即终止进程)。


5
你所写的这行代码会将中断信号的信号处理程序恢复为默认值。
void myInterruptHandler (int signum) { 
    printf("You pressed ctrl+c, but I don't care\n");
 }

int main(){
  sighandler_t oldHandler = signal(SIGINT, myInterruptHandler);
  while(true){
    printf("Ctrl + C can't kill me!!\n");
    sleep(1000);
  }
  //Change back to the old handler
  signal(SIGINT, oldHandler);
  //alternatively:  signal(SIGINT, SIG_DFL);
}

以上程序是否会让控制流到达最后一行?看起来它将被困在循环中。 - Yan King Yin
当自定义处理程序返回后,它是否会调用默认处理程序? - Yan King Yin

5
将SIGINT信号的处理设置为默认值。
如果您使用的是*nix系统,请尝试使用man signal来获取类似这样的答案。那里(也许是在“另请参阅”下列出的一些页面上)还会告诉您什么是信号。
至于默认值 - 它将是“忽略它”,“终止程序”或“使程序转储核心”的其中之一。它取决于特定的信号,我不记得SIGINT的默认值了,抱歉。

2

它设置了SIGINT的默认操作,如下所述;

来自Linux信号手册;

sighandler_t signal(int signum, sighandler_t handler);

signal()函数将信号signum的处理方式设置为handler,handler可以是SIG_IGN、SIG_DFL或程序员定义的函数的地址。

  • 如果处理方式被设置为SIG_IGN,则该信号将被忽略。
  • 如果处理方式被设置为SIG_DFL,则将执行与该信号相关联的默认操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接