Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何安装信号处理程序,以便在收到“SIGINT”时调用函数_C_Signals - Fatal编程技术网

C 如何安装信号处理程序,以便在收到“SIGINT”时调用函数

C 如何安装信号处理程序,以便在收到“SIGINT”时调用函数,c,signals,C,Signals,我应该安装一个信号处理程序,在收到SIGINT时调用函数stopContinue。这是我的C代码片段,但我不确定这是否正确。请告诉我哪里出了问题 struct sigaction act; memset(&act, '\0', sizeof(act)); action.sa_flags = 0; action.sa_handler = stopContinue; sigaction(SIGINT, &act, NULL); 这看起来大致正确吗 这里有一个关于使用sigact

我应该安装一个信号处理程序,在收到SIGINT时调用函数stopContinue。这是我的C代码片段,但我不确定这是否正确。请告诉我哪里出了问题

struct sigaction act;

memset(&act, '\0', sizeof(act));
action.sa_flags = 0; 
action.sa_handler = stopContinue;
sigaction(SIGINT, &act, NULL);
这看起来大致正确吗

这里有一个关于使用sigaction和action的讨论,这里标志的使用不同于另一个问题,这不是一个重复

如果您甚至不打算使用struct的sau flags成员,为什么要使用sigaction?要在按下Ctrl+C时调用stopContinue,可以使用:

signal(SIGINT, stopContinue);
如果您只是想忽略Ctrl+C,则可以更轻松地执行以下操作:

signal(SIGINT, SIG_IGN);

信号是一种忽略信号的方法。

当您试图运行它时发生了什么?您还需要使用例如SIGEPTYSET和act.sa_mask;清除被阻止的信号集;在memset之后。您没有检查代码当前是否忽略中断;如果是,您可能不应该重新启用中断处理。这是一个标准问题。使用sigaction,您可以使用sigactionSIGINT、NULL和act来查找当前的信号处理状态-然后您可以修改该状态并或多或少地设置一个新状态,如图所示。因为只有与SIG_DFL或SIG_IGN一起使用时,它才是可移植的,而在这里使用的是正确的POSIX.1标准函数,你的建议不好。@NominalAnimal POSIX并不完全可移植,不过。。。不要介意。不是我的意思,别傻了。POSIX语义在Linux、BSD、macOS、Solaris、Tru64等中都有使用,基本上除了Windows之外,其他地方都有使用。Windows的东西和像这样愚蠢的建议是不可移植的。@NominalAnimal信号的行为在POSIX中是否变化足够大,以至于在两个不同平台上编写signalSIGNAL,函数在收到信号时可能不会调用函数?在SysV Unix框中,函数只会在第一次信号传递时调用,以及第二次的处置重置;这意味着两个Ctrl+C快速连续通常会终止进程。BSD signal安装处理程序时,就好像通过sigaction指定了.sa_flags=sa_RESTART一样,这样传递就不会中断阻塞系统调用。由于信号处理程序通常只设置一个易失性sig_atomic_t标志,并依赖于要中断的主处理循环来检查标志,因此在BSD上不会发生这种情况。