- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
If no signal in set is pending at the time of the call, the thread shall be suspended until one or more becomes pending. The signals defined by set shall have been blocked at the time of the call to sigwait(); otherwise, the behavior is undefined. The effect of sigwait() on the signal actions for the signals in set is unspecified.
这真是模棱两可,这里的pending
和block
有什么区别?
而它关于如何在sigwait
和sigaction
之间进行选择的结论一点也不清楚:
In summary, when it is necessary for code run in response to an asynchronous signal to notify a thread, sigwait() should be used to handle the signal. Alterna- tively, if the implementation provides semaphores, they also can be used, either following sigwait() or from within a signal handling routine previously registered with sigaction().
谁能把sigwait
的理由说得更合理些?
最佳答案
每个进程都有与之关联的所谓信号掩码,它定义了一组被阻止的信号。可以使用setprocmask(2)
查询或设置信号掩码。 (对于单线程代码)和 pthread_sigmask(3)
(对于多线程代码)。
每当发出信号时(显式地通过 kill(2)
或 raise(3)
,或通过一些其他机制,例如段错误引发 SIGSEGV
),都会根据当前信号掩码检查信号.如果信号未被阻塞,则立即对其进行操作:如果已设置,则调用相应的信号处理程序,否则将运行默认操作(通常以异常状态退出或忽略它)。如果信号被信号掩码阻塞,则信号的状态设置为pending,程序继续执行。
因此请考虑以下示例程序:
#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;
}
输出:
SIGUSR1 received!
About to raise SIGUSR1
After raising SIGUSR1
sigwait got signal: 30
About to unblock SIGUSR1
SIGUSR1 received!
Unblocked SIGUSR1
关于c - 关于sigwait()的模糊描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326290/
我正在尝试编写一个多线程程序,其中一个线程(下面的可变线程)负责可能设置为此进程的任何异步信号。 我面对使用sigwait()但不响应已发送给进程的任何信号的线程。 (例如下面的SIGUSR1)。 s
我正在使用 sigwait 为某些信号阻塞我的线程。这些信号已添加到信号集中。根据 doc sigwait 应该只等待作为参数中的一组传递给它的信号,并且不应该更改该线程的信号掩码。但是出于某种我不知
如果我为 SIGABRT 设置和发出信号处理程序,同时我有一个线程在 sigwait() 上等待 SIGABRT 到来(我在其他线程中有一个被 pthread_sigmask 阻塞的 SIGABRT)
sigwait() 的手册页让我很困惑。 sigwait 的签名是 int sigwait(const sigset_t *set, int *sig); 假设我有类似于以下的代码 sigset_
在这种情况下,我有多个进程 3、1 个父进程和 2 个子进程。我希望每个 child 从他们的信号处理程序返回后继续。但有时它们会卡住,有时只有其中一个会继续。我的错误是什么?实际上我正在尝试做一些类
我在我的代码中做错了,其他进程向它发送了一个 SIGUSR2 信号: sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGILL)
我有一个主应用程序生成一个单独的线程来处理队列外的消息。当我按下 CTRL-C 时,我在 AIX 上遇到问题,因为它似乎使线程中的某些“连接句柄”变得无效。我在主程序中确实有一个捕获 SIGINT 的
我发现使用 posix pthread/signaling api 的两个线程之间的信号不一致。 这是我的测试程序 #include #include #include #include #i
我正在编写一个需要用以下 bash 行终止的多线程程序: killall -QUIT -w procname 我决定使用一个线程来接收一些我需要处理的信号,比如 SIGQUIT 和 SIGUSR1,而
在程序中,SIGCHLD 被主线程阻塞,然后 线程“THREAD_1”正在执行 sigwait(), 线程“THREAD_2” fork 一个子进程并杀死它,在这个线程中我调用了 pthread_si
我正在编写一个程序,它从一个文件中获取一系列 UNIX 命令并按顺序执行它们。为了保持一切有序,我必须初始化每个命令并通过 sigwait() 等待 SIGUSR1。当每个命令都初始化后,每个命令都可
在多线程应用程序中,所有线程都会阻塞所有信号,并且单个线程在循环中使用 sigwait 进行信号处理。 .现在我们应该考虑 EINTR使用系统调用后,如 read和 write在其他线程? while
引用 http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html 提供的代码在程序源部分下。 对该代码的更改为:1) SIGVTALRM 被
#include #include #include #include #include #include #include #include #define NUM_THREADS
有两个实时线程。第一个具有低优先级,它正在等待 sigwait() 中所有可能的信号(因此所有信号都被阻止并且传递给该函数的 sigmask 已启用所有信号)。第二个具有高优先级并向第一个(低优先级)
假设我有一个不阻塞任何信号的多线程应用程序,并且一个线程调用 sigwait() 并使用 SIGTERM 的掩码。如果进程从外部接收到SIGTERM,是否可以保证以下任一情况? 在 sigwait()
我发现以下代码在 macOS 和 Linux 中的工作方式不同: #include #include #include void catcher( int sig ) { printf(
考虑一个由多个工作线程组成的并行程序。这些线程在某些文件描述符上有一个 poll 循环。该程序应该一直运行到按下 ctrl-c/进程接收到 SIGINT。该程序不应在不必要的情况下唤醒。 我设计了以下
我正在从事一个 C/C++ 网络项目,但在同步/向我的线程发送信号时遇到困难。这是我想要完成的: 使用轮询函数轮询一组套接字 如果 POLLIN 事件中有任何套接字准备就绪,则向读取器线程和写入器线程
我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。根据here , sigsuspend 由于竞争条件不是 MT 安全的。根据here , sigwait 应该在这些情况下使
我是一名优秀的程序员,十分优秀!