2

我编写了检测 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");
}
4

2 回答 2

3

Your printf output is going down the pipe. Use fprintf(stderr, "...") instead.

于 2012-10-28T20:06:43.777 回答
0

如果您的程序在管道中使用,它会SIGPIPE在另一端没有阅读器的情况下写入。

只需安装一个SIGPIPE处理程序。

于 2012-10-28T18:11:10.573 回答