私のプログラムでは、スレッドAがスレッドAに定期的にSIGUSR1
をスレッドBに送信すると予想していました。スレッドBでは、sigwait
にブロックされます。 SIGUSR1
を受け取ったときの対応については、まだ定義していません。以下は私のコードです。ただし、プログラムはすぐに終了し、出力はUser defined signal 1
です。pthreadシグナルが機能しません
void usr1_handler();
int main(int argc, char const *argv[])
{
pthread_t tid;
pthread_attr_t attr_obj;
void *thread(void *);
pthread_attr_init(&attr_obj);
pthread_attr_setdetachstate(&attr_obj, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr_obj, thread, (void *)NULL);
while(1)
{
int ret = pthread_kill(tid, SIGUSR1);
sleep(5);
}
return 0;
}
void *thread(void *dummy)
{
int sig;
sigset_t sigmask;
struct sigaction action;
/* set up signal mask to block all in main thread */
sigfillset(&sigmask);
pthread_sigmask(SIG_BLOCK, &sigmask, (sigset_t *)0);
for (;;)
{
int err = sigwait(&sigmask, &sig);
/* define what to do with sig here */
printf("sig is %d\n", sig);
}
pthread_exit((void *)NULL);
}
子スレッドがすべてのシグナルをブロックして 'sigwait()'に到達する前に、 'SIGUSR'シグナルが送出されている可能性があります。 –
@AndrewHenleご返信ありがとうございます。しかし、最初の1つのシグナルが失われても、メインスレッドはwhile(1)ループでシグナルを永遠に送りますが、残りのシグナルはまだ届いていますか? – HuangJie
@HuangJieこれが本当に起こったのであれば、最初の信号が送信された後にあなたのプログラムは既にクラッシュしていた –