0

コメントの後に編集された質問"Oh sry it worked :D"。恥ずかしいですがpthread_sigmask、コードのバージョンも機能しなかったと言わざるを得ません。これは、ブロックが解除される前に受信pthread_sigmaskされたコードとその出力のバージョンです。SIGCHLD

void signalHandler(int signal_number) {
    if ((debug & 1) == 1) {
        cout << "\n" << getTime() << " signal handler: process " << getpid() << " received signal " << signal_number << "\n";
    }
}

void * test(void*){
     sigset_t chldmask;
    if ((sigemptyset(&chldmask) == -1) || (sigaddset(&chldmask, SIGCHLD) == -1)) {
        perror("Failed to initialize the signal mask");
        return NULL;
    }
    if (pthread_sigmask(SIG_BLOCK, &chldmask, NULL) == -1) {
        return NULL;
    }
    fprintf(stderr, "SIGCHLD signal blocked\n");
    int child = fork();
    if (child == 0) {
        cout << "\nI'm child " << getpid() << " exiting now.\n";
        fflush(stdout);
        exit();
    }
    cout << "\nI'm parent " << getpid() << " not yet exiting.\n";
    cout << "\ngonna sleep for 10 secs\n";
    sleep(10);
    cout << "\nunblocking SIGCHLD after 10 secs\n";
    if (pthread_sigmask(SIG_UNBLOCK, &chldmask, NULL) == -1) {
        return NULL;
    }
    cout << "\nExiting the thread!\n";
    fflush(stdout);
}

int main(){
      struct sigaction signalaction_struct;
      memset(&signalaction_struct, 0, sizeof (signalaction_struct));
      signalaction_struct.sa_handler = &signalHandler;
      sigaction(SIGCHLD, &signalaction_struct, NULL);
      sigaction(SIGUSR1, &signalaction_struct, NULL);
      sigaction(SIGUSR2, &signalaction_struct, NULL);          
      pthread_t test_thread;
      pthread_create(&test_thread,NULL,&test,NULL);
      pthread_join(test_thread,NULL);
      return 0;
}

出力:

SIGCHLD シグナルがブロックされました

私は親です 13177 まだ終了していません。

10秒寝ます

私は子 13182 で、現在終了しています。

2013-11-06 19:47:36 シグナル ハンドラ: プロセス 13177 がシグナル 17 を受信しました

10秒後にSIGCHLDのブロックを解除

スレッドから退出します!

スレッドからのシグナルをブロックするにはどうすればよいですか? スレッド内のコードを from から保護する必要がありましたSIGCHLDマルチスレッドプログラムでの非同期信号の処理が私の質問に答えているようですが、物事を整理する方法がわかりませんでした。いくつかの提案と説明を探しています。ありがとうございました。

4

0 に答える 0