- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据 sigsuspend() 的手册页,它将用第一个参数替换当前信号掩码集。在APUE中,我看到了一个例子如下。代码可能有点太长了,但我不想错过任何东西。
int pr_mask(char *s)
{
sigset_t sigset;
sigprocmask(0, NULL, &sigset);
printf("%s: ", s);
if(sigismember(&sigset, SIGINT)) printf("SIGINT ");
if(sigismember(&sigset, SIGQUIT)) printf("SIGQUIT ");
if(sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");
if(sigismember(&sigset, SIGALRM)) printf("SIGALRM ");
/* ..... */
printf("\n");
return 0;
}
void sig_quit(int signo)
{
pr_mask("in sig quit");
}
int main()
{
sigset_t new, old, tempset;
signal(SIGQUIT, sig_quit);
sigemptyset(&tempset);
sigaddset(&tempset, SIGINT);
sigemptyset(&new);
sigaddset(&new, SIGQUIT);
sigprocmask(SIG_BLOCK, &new, &old);
pr_mask("in critical section");
/* critical section */
sigsuspend(&tempset);
pr_mask("after return form sigsuspend");
sigprocmask(SIG_UNBLOCK, &new, NULL);
pr_mask("program exit");
return 0;
}
输出是:
in critical section: SIGQUIT
in sig quit: SIGINT SIGQUIT
after return form sigsuspend: SIGQUIT
program exit:
问题出在第二行。 SIGQUIT
仍在信号掩码集中。
它是否应该只是 SIGINT
,因为 sigsuspend 已经用 tempset
替换了信号掩码,它被设置为仅 SIGINT
?
最佳答案
在执行 SIGQUIT 处理程序时,SIGQUIT 本身被阻塞。这是为了避免意外重新进入处理程序...
来自POSIX spec for sigaction (你真的应该使用它而不是 signal
):
When a signal is caught by a signal-catching function installed by sigaction(), a new signal mask is calculated and installed for the duration of the signal-catching function (or until a call to either sigprocmask() or sigsuspend() is made). This mask is formed by taking the union of the current signal mask and the value of the sa_mask for the signal being delivered, and unless SA_NODEFER or SA_RESETHAND is set, then including the signal being delivered.
When a signal occurs, and func points to a function, it is implementation-defined whether the equivalent of a:
signal(sig, SIG_DFL);
is executed or the implementation prevents some implementation-defined set of signals (at least including sig) from occurring until the current signal handling has completed.
因此,操作系统在信号处理功能期间简单地将信号添加到掩码是合法的,显然这就是 Linux 所做的。
关于c - sigsuspend(),替换设置还是添加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6729147/
sigsuspend 更改信号掩码,暂停调用线程的执行,直到它接收到“其 Action 是执行信号捕获函数或终止进程的信号”,然后(如果进程没有终止并且信号处理程序返回)将信号掩码恢复到其原始状态。
根据 sigsuspend() 的手册页,它将用第一个参数替换当前信号掩码集。在APUE中,我看到了一个例子如下。代码可能有点太长了,但我不想错过任何东西。 int pr_mask(char *s)
长话短说,我有来自同一个可执行文件的两个进程。它们旨在相互通信并为这些进程前面的用户创建聊天。称它们为p1,p2; p1 会更快地输入初始详细信息(例如名称),因此它必须等到 p2 执行同样的操作。这
我试图同步父亲和 child ,下面的代码不起作用(显然 usr_interrupt++ 不是原子的)。信号量似乎也无济于事。 #include #include #include #inclu
对于家庭作业,我必须只使用 linux 系统调用来管理游戏中的信号,用 C 编程。我必须做的一件事是在 thread 中无限期调用 sigsuspend 并等待 SIGALRM,然后如果有 sigal
我的目标是使主进程与其“ fork ”子进程相互通信。通信是通过信号传递完成的。 当第一个 child 在等待 SIGUSR1 信号时卡住等待时,我的问题就出现了。 我真的不知道为什么它会卡在这一点上
假设有两个进程,一个父进程和一个子进程,它们使用信号进行同步。在父进程中,用于与子进程同步的函数如下所示。 WAIT_CHILD(){ while(sigflag == 0){ //sigflag
考虑以下 POSIX 系统的 C 代码: #include #include #include #include #define CONTINUE_SIGNAL SIGINT void con
我正在阅读有关 Linux x86-64 系统的信号/ECF 的教科书章节(CS:APP,第 3 版,第 8 章,第 781 页),并遇到了这个: The sigsuspend function te
我正在使用 golang 开发一个项目。该项目调用 LSF 的 C API(作业调度程序 https://en.wikipedia.org/wiki/Platform_LSF)。一些 API 在与 L
我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。根据here , sigsuspend 由于竞争条件不是 MT 安全的。根据here , sigwait 应该在这些情况下使
我是一名优秀的程序员,十分优秀!