2

私は、シグナル処理に関する特定の要件を備えた Linux でマルチスレッド プログラムに取り組んできました。たとえば、単一の Ctrl-C 入力の統計を出力するプログラムが必要です。

pthread_sigmask と sigwait を使用してこれを実装しました。つまり、残りのスレッドを作成する前に、メイン スレッドで重要でないシグナルをすべてブロックし、sigwait でブロックされた「キャッチャー」スレッドを開始します。

初期化 (メイン):

sigfillset(&set);
sigdelset(&set, SIGSEGV);
sigdelset(&set, SIGBUS);
sigdelset(&set, SIGILL);

s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
    handle_error_en(s, "pthread_sigmask");

s = pthread_create(&signal_thread, NULL, &sig_thread, (void *) &set);
if (s != 0)
    handle_error_en(s, "pthread_create");

キャッチャー スレッド ルーチン:

void *sig_thread(void *arg) {
    sigset_t *set = (sigset_t *) arg;
    int s, sig;

    pthread_detach(pthread_self());

    for(;;) {
        s = sigwait(set, &sig);
        if (s != 0)
            handle_error_en(s, "sigwait");
        switch(sig) {
            case SIGINT:
                break;
            case SIGTERM:
                break;
            case SIGUSR1:
                break;
            case SIGUSR2:
                break;
            default:
                break;
        }
    }
    pthread_exit(NULL);
    return NULL;
}

すべてが期待どおりに機能しますが、キャッチ メカニズムにより、GDB がプログラムを一時停止できなくなります (SIGINT ルーチンがトリガーされます)。どうすればこれを修正できますか?

ありがとう

4

1 に答える 1

6

gdb をアタッチする前 に、 SIGSTOP(の代わりに) を使用してプログラムを一時停止してみてください。キャッチまたは無視することはできず、gdb がアタッチされるまでプログラムが中断されます (その後、続行できます)。SIGINTSIGSTOP

于 2012-07-19T10:04:51.903 に答える