コメントの後に編集された質問"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
。マルチスレッドプログラムでの非同期信号の処理が私の質問に答えているようですが、物事を整理する方法がわかりませんでした。いくつかの提案と説明を探しています。ありがとうございました。