2

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");
}
4

2 に答える 2

3

あなたのprintf出力はパイプを下っています。fprintf(stderr, "...")代わりに使用してください。

于 2012-10-28T20:06:43.777 に答える
0

プログラムがパイプで使用されてSIGPIPEいる場合、反対側にリーダーがないときにプログラムが書き込むと取得されます。

SIGPIPEハンドラーをインストールするだけです。

于 2012-10-28T18:11:10.573 に答える