多线程环境 - 类似unix的环境中的c ++中的信号处理(freeBSD和linux)

时间:2014-09-25 06:11:41

标签: linux multithreading unix signal-handling

我写了一个网络数据包监听程序,我有2个线程。两者都永远运行,但其中一人睡30秒,其他人睡90秒。在main函数中,我使用了sigaction函数,在安装了信号处理程序之后,我创建了这两个线程。创建线程后,main函数调用pcaploop函数,这是无限循环。我的课程的基本结构: (我使用伪语法)

signalHandler()  
   only sets a flag (exitState = true)

thread1()   
{  
    while 1  
    {  
       sleep 30 sec  
       check exit state, if so exit(0);  
       do smth;   
     }  
}

thread2()
{
    while 1
    {
       sleep 90 sec
       check exit state, if so exit(0);
       do smth;

    }
}

main()
{
    necassary snytax for sigaction ;
    sigaction( SIGINT, &act, NULL ); 
    sigaction( SIGUSR1, &act, NULL ); 

    create thread1;
    create thread2;

    pcaploop(..., processPacket,...); // infinite loop, calls callback function (processPacket) everytime a packet comes.

    join threads;
    return 0; 

}

processPacket()
{
   check exitState, if true exit(0);
   do smth;
}

这是我的问题。当我按 CTRL - C 程序不会终止。如果程序运行时间少于6-7小时,当我按 CTRL - C 时,程序将终止。如果程序运行1晚,至少10个小时或更长时间,我无法终止该程序。实际上,不会调用信号处理程序。

可能是什么问题?哪个线程能够捕获信号?

2 个答案:

答案 0 :(得分:0)

基本上最好删除你在示例中放入的所有伪代码,并保留最小的工作代码,具体到底是什么。

从我的例子到目前为止,我看到sigaction的错误处理缺失。

尝试对代码中的错误进行检查。

答案 1 :(得分:0)

我正在为那些遇到过这个问题的人写这篇文章。我的问题是关于线程的同步。我得到句柄同步问题后,程序现在可以处理信号了。我的建议是再次检查同步并确保它正常工作。

对不起,我很抱歉。

编辑: 我也使用sigaction进行信号处理 我已经更改了我的全局bool变量whit这个定义:

static volatile sig_atomic_t exitFlag = 0;

此标志用于检查是否收到信号。