- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 FreeBSD 上使用 sigtimedwait() 捕获 SIGCHLD 信号时遇到问题。以下源代码在 Debian GNU/Linux 7 上运行良好,但为我提供了在 FreeBSD 9.1 上暂时不可用的资源:
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
int main() {
sigset_t set;
pid_t pid;
printf("SIGCHLD is %i\n", SIGCHLD);
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);
pid = fork();
if(pid == -1) {
printf("fork failed: %s\n", strerror(errno));
exit(1);
} else if(pid) {
sigset_t set2;
siginfo_t siginfo;
struct timespec timeout = {3, 0};
int signal;
sigemptyset(&set2);
sigaddset(&set2, SIGCHLD);
signal = sigtimedwait(&set2, &siginfo, &timeout);
if(signal == -1) {
printf("sigtimedwait failed: %s\n", strerror(errno));
exit(2);
} else {
printf("received signal %i from %i with status %i\n", signal, siginfo.si_pid, siginfo.si_status);
}
} else {
sleep(1);
exit(123);
}
return 0;
}
Linux 上的输出:
SIGCHLD is 17
received signal 17 from 27600 with status 123
FreeBSD 上的输出:
SIGCHLD is 20
sigtimedwait failed: Resource temporarily unavailable
使用 signal() 在 BSD 上工作得很好,但这并不是我想要的。我错过了什么?
最佳答案
我认为这是 FreeBSD 中的一个内核/库错误。看起来 sigtimedwait 没有报告信号,因为默认情况下它被忽略。所以你可以做两件事
为 SIGCHLD 事件安装信号处理程序。即使它永远不会被调用,因为您阻止了信号,它也会解决该错误。
将 kqueue 与 EVFILT_SIGNAL 一起使用,在这种情况下肯定可以工作,但不可移植(因此您需要 ifdef)
对于 2,这是等效的代码
int kq = kqueue();
struct kevent ke;
EV_SET(&ke, SIGCHLD, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);
if (kevent(kq, NULL, 0, &ke, 1, &timeout) == 1) {
signal = ke.ident;
}
else {
// Catches errors in the add, timeout, and kevent wait
signal = -1;
}
close(kq);
// note that siginfo is not populated, there is no way to populate it using kqueue.
关于在 BSD 上使用 sigtimedwait() 捕获 SIGCHLD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012206/
我应该实现一个信号处理程序,它在第一次调用某个信号时停止程序中的所有线程,如果它们已经停止则恢复它们。我使用以下代码实现了在后台运行的恶魔线程: void *handle_sig(void *arg)
我尝试根据下面的代码使用 sigtimedwait,我收到此消息“捕获意外信号 4714397,错误 0,代码 370078816”。有谁知道我在哪里可以找到这些号码对应的 map ? sig
我的程序有一个受 epoll 约束的事件循环(用于 I/O)和条件变量(用于其他消息事件),以及负责捕获信号的工作线程(SIGINT、SIGTERM、SIGHUP)。 SIGINT , SIGTERM
我正在尝试学习如何使用 sigtimedwait(),但我发现它并没有等待超时完成。下面它似乎比它应该更快地返回 EAGAIN 4 秒(每 1 分钟超时快 1 秒): #include #inclu
我最近一直在研究 Linux 上的信号处理,并阅读了所有与信号处理相关的概念。一个困扰我的问题是,为什么在进程畅通无阻时,sigtimedwait() 集合中的信号没有被传递。我的代码如下:- #in
我在 sigtimedwait () 发生崩溃,一旦在运行无限时间的线程函数中运行下面所述的代码块。在运行于 debian 9.3 上的应用程序中使用 sigtimedwait 来查找 SIGUSR1
我在 FreeBSD 上使用 sigtimedwait() 捕获 SIGCHLD 信号时遇到问题。以下源代码在 Debian GNU/Linux 7 上运行良好,但为我提供了在 FreeBSD 9.1
我是一名优秀的程序员,十分优秀!