0

特定のシグナルが初めて呼び出されたときにプログラム内のすべてのスレッドを停止し、既に停止している場合は再開するシグナルハンドラーを実装することになっています。次のコードを使用して、バックグラウンドで実行されるデーモン スレッドを実装しました。

void *handle_sig(void *arg)
{
    sigset_t set;
    //set set...

    struct timespec to;
    to.tv_sec = 1;
    to.tv_nsec = 0;

    while (_keepListening) {

        int ret = sigtimedwait(&set, NULL, &to);

        if (ret < 0)
            if (errno == EAGAIN) {
                continue; /* no signal sent*/
            } else {
                fprintf(stderr, "Failed...\n");
                exit(1);
            }

        if (_state == PAUSE_STATE) { /* was blocked*/
            //do something
        } else {
`                       //do something else
        }

    }
    return NULL;
}

問題は、シグナルが送信されて検出され、while ループに再び入る前に別のシグナルが送信された場合、2 番目のシグナルが無視され、プログラムが永久に一時停止したままになる可能性があることです。sigtimedwait への最後の呼び出し以降にシグナルが送信されたかどうかを検出する方法はありますか?

ありがとうございました

4

1 に答える 1

0

処理を非同期にすることを考えるかもしれません。

たとえば、「何かをしている」または「何か他のことをしている」ためのスレッドを開始することによって。

于 2012-04-12T11:51:13.460 に答える