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