我编写了检测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");
}
答案 0 :(得分:3)
您的printf
输出正在管道中。请改用fprintf(stderr, "...")
。
答案 1 :(得分:0)
如果您的程序在管道中使用,如果它在另一侧没有读者时写入,则会得到SIGPIPE
。
只需安装SIGPIPE
处理程序。