我写了一个网络数据包监听程序,我有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个小时或更长时间,我无法终止该程序。实际上,不会调用信号处理程序。
可能是什么问题?哪个线程能够捕获信号?
答案 0 :(得分:0)
基本上最好删除你在示例中放入的所有伪代码,并保留最小的工作代码,具体到底是什么。
从我的例子到目前为止,我看到sigaction
的错误处理缺失。
尝试对代码中的错误进行检查。
答案 1 :(得分:0)
我正在为那些遇到过这个问题的人写这篇文章。我的问题是关于线程的同步。我得到句柄同步问题后,程序现在可以处理信号了。我的建议是再次检查同步并确保它正常工作。
对不起,我很抱歉。
编辑: 我也使用sigaction进行信号处理 我已经更改了我的全局bool变量whit这个定义:
static volatile sig_atomic_t exitFlag = 0;
此标志用于检查是否收到信号。