所以这是我的代码:
void sigHandle(int sig)
{
signal(SIGINT, sigHandle); //Is this line necessairy?
cout<<"Signal: "<<sig<<endl;
}
int main(){
signal(SIGINT, sigHandle);
while(true){ //Supposed to loop until user exits.
//rest of my code
}
}
现在,我对signal()的理解是,当收到SIGINT命令(Ctrl + C对吗?)时,应使用2的整数值(SIGINT号)调用函数sigHandle。 ,该方法应该运行,并且程序应NOT退出。
我只想打印信号编号并继续,但是在打印出“ Signal:2”之后,它退出。
(最终,我应该处理前32个中断,但是我认为Ctrl + C将是最困难的,所以我从这里开始。)
主要是如果我做signal(SIGINT,SIG_IGN);,它会正确忽略信号并且不会退出,但是现在我无法知道是否收到了SIGINT中断。
早些时候我在使用sigaction结构,但是我找不到关于它的任何真正全面的文档,所以我决定只使用“原始”信号处理。
这是我的签名代码(与上面相同的问题:
struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);
感谢您的帮助!
好吧,在花了很多小时浏览手册页和互联网之后,我遇到了一个(非常)贫民窟的解决方案,涉及保存堆栈预无限循环,然后在中断到来时做我需要做的事,然后重新-将堆栈设置回原来的位置,并调用sigrelse()命令以重新设置可能已更改但尚未重新加载的所有状态。
我知道这不是解决这个问题的最优雅/最有效/甚至不是社会上可以接受的解决方案,但是它有效,据我所知,我没有在任何地方泄漏任何内存,所以一切都很好...
我仍在寻找解决此问题的方法,我将我的堆栈重新设置shenanigins只是一个临时解决方案...
谢谢!
也请注意,您不应在信号处理程序中调用stdio(或其他不可重入函数)。(您的信号处理程序可能在malloc或与C ++等效的中间调用)
不是。您只需用相同的功能替换SIGINT的句柄即可。您如何编程执行等待?
如果您有类似的东西:
int main
{
// ...
int r = read(fd, &buff, read_size); // your program hangs here, waiting for the data.
// but if signal occurred during this period of time
// read will return immediately, and r may != read_size
return 0; // then it will go straight to return.
}