Gab*_*yer 164

signal不是最可靠的方式,因为它在实现上有所不同.我建议使用sigaction.Tom的代码现在看起来像这样:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}
Run Code Online (Sandbox Code Playgroud)

  • <stdlib.h>等等 - 它是C,而不是C++.在C++中,您应该使用<cstdlib> (35认同)
  • `printf()`不是异步信号安全的,因此不能在信号处理程序中使用. (8认同)
  • 这些功能在Windows上不可用. (4认同)
  • 我认为 my_handler 应该采用 `int s` 作为参数。`sig_t` 本身就是一个函数指针类型。 (2认同)
  • 对`sa_mask` 和`sa_flags` 有一些解释会很好。 (2认同)

Chr*_*ith 49

对于Windows控制台应用程序,您希望使用SetConsoleCtrlHandler来处理CTRL+ CCTRL+ BREAK.

请看这里的例子.


Tom*_*Tom 34

你必须捕获SIGINT 信号(我们正在谈论POSIX吗?)

请参阅@Gab Royer对sigaction的回答.

例:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

void my_handler(sig_t s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{
   signal (SIGINT,my_handler);

   while(1);
   return 0;

}
Run Code Online (Sandbox Code Playgroud)

  • 我知道它很旧,但这不能在 g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 中编译。我必须将“void my_handler(sig_t s)”更改为“void my_handler(sig_atomic_t s)”。 (4认同)
  • signal()的行为有所不同,具体取决于它是否遵循BSD或SysV样式.sigaction()是首选. (2认同)