2

所以这是我的代码:

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对吗?)时,我的函数 sigHandle 应该用整数值 2(SIGINT 编号)调用,该方法应该运行并且程序不应该退出

我想做的只是打印信号编号并继续前进,但是在打印出“信号:2”后它会退出。

(最终我应该处理前 32 个中断,但我认为Ctrl+C将是最困难的,所以我从这里开始。)

如果我主要做信号(SIGINT,SIG_IGN);它正确地忽略了信号并且没有退出,但我现在无法知道我是否收到了 SIGINT 中断。

早些时候我在玩 sigaction 结构,但我找不到任何真正全面的文档,所以我决定只使用“原始”信号处理。

这是我的 sigaction 代码(与上述相同的问题):

struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);

谢谢你的帮助!

编辑

好的,所以在通过手册页和互联网浏览了很多很多小时后,我遇到了一个(非常)贫民窟解决方案,其中涉及保存堆栈预无限循环,然后当中断来临时,做我需要做的事情,然后重新设置堆栈回到原来的位置并调用 sigrelse() 命令重新设置任何可能已更改但未重新加载的状态。

我知道这不是解决这个问题的最优雅/最有效/甚至不是社会可接受的解决方案,但它有效,据我所知,我没有在任何地方泄漏任何内存,所以一切都很好......

我仍在寻找解决此问题的方法,并且我认为我的堆栈重新设置恶作剧只是一个临时修复...

谢谢!

4

2 回答 2

0

它不是。您只需用相同的功能替换 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.
}
于 2011-09-30T13:44:16.773 回答
0

另请注意,您不应在信号处理程序中调用 stdio(或其他不可重入函数)。(您的信号处理程序可能在 malloc 的中间被调用,或者它是 C++ 等效的)

于 2011-09-30T13:49:18.923 回答