- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 sigwait 为某些信号阻塞我的线程。这些信号已添加到信号集中。根据 doc sigwait 应该只等待作为参数中的一组传递给它的信号,并且不应该更改该线程的信号掩码。但是出于某种我不知道的原因,它正在更改信号掩码的线程。它会阻止除 sigs 中的信号之外的所有信号。我不希望这发生。有人可以帮助我吗?提前致谢
代码片段:
sigset_t sigs;
int sig_recvd;
sigset_t old_mask;
sigemptyset(&sigs);
sigaddset(&sigs, SIGUSR1);
sigaddset(&sigs, SIGTERM);
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGINT);
sigaddset(&sigs, SIGPIPE);
sigaddset(&sigs, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigs, &old_mask);
do
{
sigwait(&sigs, &sig_recvd);
//Switch for some signal handling
} while(1);
sigwait 之前的 Sigblk:0000000080014203
sigwait 期间的 Sigblk:ffffffffeffabcfc
我不知道 sigwait 函数有什么问题,但是当我对 sigwaitinfo 做同样的事情时,一切都对我有用。无法弄清楚是什么让后来的工作成功,但现在我的问题已经解决了。但是我想知道两者在实现上有什么不同
最佳答案
我不太确定你的问题是什么,如果你的问题是“为什么 sigwait 在执行期间 而不是 之后 更改 sigmast”,那么它就是case,sigwait在执行的时候会解锁signal,不然怎么会指望signal来呢?这是 APUE 的摘录:如果在调用 sigwait 时集合中指定的信号之一处于挂起状态,则 sigwait 将无阻塞地返回。在返回之前,sigwait 从进程的未决信号集中删除该信号。为避免错误行为,线程必须在调用 sigwait 之前阻塞它正在等待的信号。 sigwait 函数将自动解除对信号的阻塞并等待一个信号被传送。在返回之前,sigwait 将恢复线程的信号掩码。如果在调用 sigwait 时信号未被阻塞,则会打开一个计时窗口,其中一个信号可以在线程完成对 sigwait 的调用之前传递给线程。
。
关于c - sigwait 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7750248/
我正在尝试编写一个多线程程序,其中一个线程(下面的可变线程)负责可能设置为此进程的任何异步信号。 我面对使用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 应该在这些情况下使
我是一名优秀的程序员,十分优秀!