SIGINTを検出するコンソールプログラムを作成したので、ユーザーがCtrl + Cを押すと、プログラムはいくつかのアクションを実行して終了します。
しかし、パイプを使用してこのプログラムを他のプログラムにリダイレクトすると、たとえば、次のようになります
./my_program | tee xxx
。SIGINTがハンドラーに到達することはありません。このプログラムにもかかわらず終了します。SIGTERMを渡しても効果はありません。Ctrl+Cの後にもSIGTERMはありません。
すべての状況で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");
}