首页 >后端开发 >C++ >如何使用 Sigaction 函数在 C 中优雅地处理 Ctrl-C 中断?

如何使用 Sigaction 函数在 C 中优雅地处理 Ctrl-C 中断?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-13 01:35:02555浏览

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

Intercepting Ctrl-C Events in C

捕捉 Ctrl-C 事件是编程中的一项必要任务,尤其是在您希望对意外中断做出优雅响应的情况下。

使用 Sigaction

在 C 中,使用 sigaction 函数来处理信号更可靠。其语法如下:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

其中:

  • signum:要处理的信号的编号,对于 Ctrl-C,为 SIGINT。
  • act:指定新信号处理程序的动作。
  • oldact:存储以前的行为。

在 Thomas 给出的示例中,sigaction 结构如下:

struct sigaction sigIntHandler;

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

其中:

  • sa_handler:指向处理程序函数。
  • sa_mask:要阻止处理此信号期间的信号掩码。
  • sa_flags:附加标志,通常为 0。

将此 sigaction 结构与 SIGINT 信号一起使用:

sigaction(SIGINT, &sigIntHandler, NULL);

处理程序函数

最后,您需要一个处理程序函数来响应信号。在示例中,my_handler 仅打印一条消息并退出程序:

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

完整代码

以下是将 sigaction 用于捕捉 Ctrl-C 事件的完整代码:

#include 
#include 
#include 
#include 

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;    
}

通过使用 sigaction,您可以可靠地捕捉 Ctrl-C 事件并采取适当的措施。

以上是如何使用 Sigaction 函数在 C 中优雅地处理 Ctrl-C 中断?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn