c ++ SIGTERM在捕获后没有返回

时间:2011-05-17 12:25:51

标签: c++ linux unix

我试图在我的程序中捕获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();
}

编辑:抱歉没有正确完成代码。

4 个答案:

答案 0 :(得分:3)

你需要停止“volatile”,否则编译器实际上不会在循环中检查它,因为它认为它不会改变。

bool volatile stop;

答案 1 :(得分:3)

也许这与未初始化的struct sigaction的其他成员有关。 gdb可能会将内存初始化为0,而在没有gdb的情况下它不会被初始化。

答案 2 :(得分:0)

您可能会发现任何信号(尤其是SIGTERM)将终止您在while循环中执行的任何系统调用。 “系统调用”是指从套接字读取或选择或连接的任何内容。

Check out this write up.

Also check the example test program

答案 3 :(得分:0)

如上所述,volatile是正确的答案。另外我想补充说根据你的代码sigwait()将是更好的解决方案而不是循环...在sigwait的情况下BTW你不需要信号处理程序

Opps,抱歉错过了套接字操作