输出重定向时SIGINT丢失;如何检测程序中的终止?

时间:2012-10-28 18:06:11

标签: c linux sigint

我编写了检测SIGINT的控制台程序,因此当用户按Ctrl + C程序执行某些操作并终止时。

但是当我用管道将这个程序重定向到任何其他程序时,例如: ./my_program | tee xxx SIGINT永远不会来到我的处理程序。尽管这个程序终止了。 处理SIGTERM没有任何影响。 SIGTERM也不会在Ctrl + C之后出现。

如何在所有情况下检测到程序是否被Ctrl + c中止?


我的SIGINT和SIGPIPE的测试用例:

    #include <csignal>
#include <cstdio>

bool break_request=false;
bool term_request=false;

extern "C" void break_handler(int)
{
    break_request=true;
    printf("Ctrl+C detected\n");
}

extern "C" void term_handler(int)
{
    term_request=true;
    printf("pipe detected\n");
}

int main()
{
    signal(SIGINT,break_handler);
    signal(SIGPIPE,term_handler);

    while(true)
    {
        if(break_request)
        {
            printf("break request handled\n");
            break;
        }

        if(term_request)
        {
            printf("pipe request handled\n");
            break;
        }
    }

    printf("terminating\n");
}

2 个答案:

答案 0 :(得分:3)

您的printf输出正在管道中。请改用fprintf(stderr, "...")

答案 1 :(得分:0)

如果您的程序在管道中使用,如果它在另一侧没有读者时写入,则会得到SIGPIPE

只需安装SIGPIPE处理程序。