为什么我必须在等待特定信号之前设置 pthread_sigmask
Why if I have to set the pthread_sigmask before I wait to the specific signal
在其中一个线程中我必须等待特定的实时信号,但我不明白为什么在等待特定信号之前我必须首先为线程设置整个 sigmask。
sigset_t signals;
siginfo_t info;
sigfillset(&signals);
sigdelset(&signals, SIGRTMIN+1);
//why do we need this?
pthread_sigmask(SIG_SETMASK, &signals, NULL);
sigemptyset(&signals);
sigaddset(&signals, SIGRTMIN+1);
sigwaitinfo(&signals, &info);
printf("This is thread %d %d\n", pthread_self(), info.si_value.sival_int);
通过查看代码,开发人员似乎想要暂停线程的执行,直到 SIGRTMIN+1
成为线程 (sigwaitinfo(2)) 的待定状态。同时他不希望线程执行应该被其他信号干扰(即线程不应该对除 SIGRTMIN+1
之外的任何信号做出反应)所以他使用以下语句屏蔽了其他信号:
//why do we need this?
pthread_sigmask(SIG_SETMASK, &signals, NULL);
这里要注意的一点是,即使使用上面的语句屏蔽了除SIGRTMIN+1
之外的所有信号,线程执行总是容易出现SIGSTOP
和SIGKILL.
在其中一个线程中我必须等待特定的实时信号,但我不明白为什么在等待特定信号之前我必须首先为线程设置整个 sigmask。
sigset_t signals;
siginfo_t info;
sigfillset(&signals);
sigdelset(&signals, SIGRTMIN+1);
//why do we need this?
pthread_sigmask(SIG_SETMASK, &signals, NULL);
sigemptyset(&signals);
sigaddset(&signals, SIGRTMIN+1);
sigwaitinfo(&signals, &info);
printf("This is thread %d %d\n", pthread_self(), info.si_value.sival_int);
通过查看代码,开发人员似乎想要暂停线程的执行,直到 SIGRTMIN+1
成为线程 (sigwaitinfo(2)) 的待定状态。同时他不希望线程执行应该被其他信号干扰(即线程不应该对除 SIGRTMIN+1
之外的任何信号做出反应)所以他使用以下语句屏蔽了其他信号:
//why do we need this?
pthread_sigmask(SIG_SETMASK, &signals, NULL);
这里要注意的一点是,即使使用上面的语句屏蔽了除SIGRTMIN+1
之外的所有信号,线程执行总是容易出现SIGSTOP
和SIGKILL.