我试图在我的程序中捕获SIGTERM,这就是问题所在。
我的程序启动并设置信号SIGTERM的监听器。程序然后进入一个循环,使用select连续检查套接字文件描述符,使其无阻塞。当我通过kill发送程序TERM时,程序确认它收到信号,但是它没有返回到我之前描述的循环
信号处理程序在类中设置一个公共变量,以便循环知道退出。我应该提一下,在gdb中这可行,但在gdb之外它不起作用。
提前致谢。
class A
{
public:
bool volatile stop;
void loop();
{
while(!stop)
{
//check socket
}
}
};
A *aptr;
void sigterm_handler(int i)
{
aptr->stop = true;
}
int main()
{
A a;
aptr = &a;
struct sigaction sa;
sa.sa_handler = &sigterm_handler;
sigaction(SIGTERM, &sa, NULL);
a.stop = false;
a.loop();
}
编辑:抱歉没有正确完成代码。
答案 0 :(得分:3)
你需要停止“volatile”,否则编译器实际上不会在循环中检查它,因为它认为它不会改变。
bool volatile stop;
答案 1 :(得分:3)
也许这与未初始化的struct sigaction
的其他成员有关。 gdb
可能会将内存初始化为0,而在没有gdb
的情况下它不会被初始化。
答案 2 :(得分:0)
您可能会发现任何信号(尤其是SIGTERM)将终止您在while循环中执行的任何系统调用。 “系统调用”是指从套接字读取或选择或连接的任何内容。
答案 3 :(得分:0)
如上所述,volatile是正确的答案。另外我想补充说根据你的代码sigwait()将是更好的解决方案而不是循环...在sigwait的情况下BTW你不需要信号处理程序
Opps,抱歉错过了套接字操作