0

シグナルをキャッチし、シグナルがキャッチされたことを示すグローバルを設定してから、メイン ループのあとがきに戻りたいと考えています。これが私のコードです。

int main(int mainargc, char **mainargv)
{
.
.
.
    sig_handler.sa_handler = sigint_handler;
    sigemptyset(&sig_handler.sa_mask);
    sig_handler.sa_flags = 0;
    sigaction(SIGINT, &sig_handler, NULL);
.
.
. 
    while(1)
    {
    //main loop
    }
}

void sigint_handler(int signal)
{
    int saved_error = errno;

    g_sigint_happened = 1;

    //TODO -- send sigint to children

    errno = saved_error;

}

私の問題は、シグナル ハンドラが呼び出されているのに、プログラムがまだ終了していることです。シグナルハンドラーにメインに戻るように指示する方法がわかりません。

4

1 に答える 1

3

シグナル ハンドラが呼び出された後、実行を再開するために特別なことをする必要はありません。

あなたの問題は、シグナルが のブロッキングシステムコールを中断したことである可能性があります。これにより、 に設定されmainたエラーが返されます。これを特にチェックしてシステムコールを再起動していない場合は、プロセスが終了する原因となっている一般的なエラーケースが発生している可能性があります。errnoEINTR

于 2012-11-26T01:35:20.553 に答える