如果在呼叫时没有设置中的信号未决,则该线程将被暂停,直到一个或多个信号等待.由set定义的信号在调用sigwait()时应被阻止; 否则,行为未定义.未指定sigwait()对set中信号的信号动作的影响.
这真的很模糊,这里pending和block这里有什么区别?
关于如何选择sigwait和sigaction不清楚的结论:
总之,当响应异步信号运行的代码需要通知线程时,应该使用sigwait()来处理信号.或者,如果实现提供信号量,它们也可以在sigwait()之后使用,或者在先前使用sigaction()注册的信号处理例程中使用.
有人可以说理性sigwait更合理吗?
Ada*_*eld 22
每个进程都有一个与之相关的信号掩码,它定义了被阻塞的信号集.可以使用setprocmask(2)(对于单线程代码)和pthread_sigmask(3)(对于多线程代码)查询或设置信号掩码.
无论何时提出信号(通过kill(2)或raise(3)通过诸如分段故障提升之类的其他机制SIGSEGV),都会针对当前信号掩码检查信号.如果信号未被阻止,则立即对其进行操作:如果设置则调用相应的信号处理程序,否则运行默认操作(通常以异常状态退出或忽略它).如果信号被信号掩码阻止,则信号的状态被设置为待决,程序继续执行.
请考虑以下示例程序:
#include <signal.h>
#include <stdio.h>
void on_sigusr1(int sig)
{
// Note: Normally, it's not safe to call almost all library functions in a
// signal handler, since the signal may have been received in a middle of a
// call to that function.
printf("SIGUSR1 received!\n");
}
int main(void)
{
// Set a signal handler for SIGUSR1
signal(SIGUSR1, &on_sigusr1);
// At program startup, SIGUSR1 is neither blocked nor pending, so raising it
// will call the signal handler
raise(SIGUSR1);
// Now let's block SIGUSR1
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);
// SIGUSR1 is now blocked, raising it will not call the signal handler
printf("About to raise SIGUSR1\n");
raise(SIGUSR1);
printf("After raising SIGUSR1\n");
// SIGUSR1 is now blocked and pending -- this call to sigwait will return
// immediately
int sig;
int result = sigwait(&sigset, &sig);
if(result == 0)
printf("sigwait got signal: %d\n", sig);
// SIGUSR1 is now no longer pending (but still blocked). Raise it again and
// unblock it
raise(SIGUSR1);
printf("About to unblock SIGUSR1\n");
sigprocmask(SIG_UNBLOCK, &sigset, NULL);
printf("Unblocked SIGUSR1\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
SIGUSR1 received!
About to raise SIGUSR1
After raising SIGUSR1
sigwait got signal: 30
About to unblock SIGUSR1
SIGUSR1 received!
Unblocked SIGUSR1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11853 次 |
| 最近记录: |