- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我创建一个 sigset_t
并将其设置为空,然后向其添加 SIGCHLD
,然后将其设置为 BLOCK
:
sigset_t sigmask;
sigemptyset (&sigmask);
sigprocmask (SIG_BLOCK, &sigmask, NULL);
然后通过signalfd4()
创建一个signalfd
int signalfd = signalfd4 (-1, &sigmask, sizeof(sigset_t), SFD_NONBLOCK);
然后添加到之前创建的epollfd中:
struct epoll_event epev;
memset (&epev, 0, sizeof(struct epoll_event));
epev.events = POLLIN;
int retval = epoll_ctl (epollfd, EPOLL_CTL_ADD, signalfd, &epev);
retval为0;
最后,我使用 epoll_wait(epollfd, ...)
等待我的子进程,它由 fork() 关心并休眠 2 秒,什么都不做,然后退出,但没有任何返回。
任何人请给我一些帮助吗?谢谢!
最佳答案
在设置好信号和信号 fd 后,我发现以下方法有效:
epev.fd = sigfd; // sigfd if from signalfd, need to remember it
pid_t me = getpid();
fork();
对于家长:
if ( me == getpid() ) {
// parent
while ( 1 ) { // loop of epoll_wait
retval = epoll_wait ( epollfd, &epev, 1, -1 );
如果这是信号,fd 读取它以找出发送的是哪个信号。
if ( epev.data.fd == sigfd ) {
struct signalfd_siginfo si;
while ( 1 ) {
int nr = read ( sigfd, &si, sizeof si );
if ( nr != sizeof si ) {
break; // done reading from the signal fd
}
if ( si.ssi_signo == SIGCHLD ) {
在收到 SIGCHILD 时做 parent 需要做的事情
} else {
一些其他信号
}
}
}
}
} else {
// child
子代码
关于c - 当我的子进程退出时,如何使用 signalfd 和 epoll 获取事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607579/
是否有 signalfd 的替代方案(在 Mac OS X 上不可用)?我正在使用 select 复用 I/O,并希望以某种同步方式接收信号。 最佳答案 man kqueue 并在那里查找 EVFIL
在我的程序中,我使用 signalfd 来处理信号并将其与 poll 结合用于异步 IO。下面是我的代码: #include #include #include #include #inclu
在 signalfd 上调用 read() 是否会消耗 SIGCHLD?或者我需要在之后调用 waitid() 来消费吗? 我通过调用 epoll_wait() 在 signalfd 上接收到可读事件
我的系统是ubuntu 12.04。我修改了 man 2 signalfd 的示例,并在示例中添加了 sigaddset(&mask, SIGSEGV)。但是生成 SIGSEGV 时我无法获得输出。
为特定信号指定处理程序的经典方法是通过 sigaction。 Linux 还提供了 signalfd 功能,我们可以在其中将信号连接到文件描述符,然后将 select/(e)poll 应用于该描述符,
三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: lsignalfd 传统的处理信号
我正在使用套接字和系统调用编写自己的echo 服务器。我使用 epoll 同时与许多不同的客户端一起工作,并且与客户端完成的所有操作都是非阻塞的。当服务器开启且不执行任何操作时,它处于 epoll_w
我创建一个 sigset_t 并将其设置为空,然后向其添加 SIGCHLD,然后将其设置为 BLOCK: sigset_t sigmask; sigemptyset (&sigmask); si
我知道 linux 操作系统中的 signalfd()、eventfd() api。但是,我在其他操作系统(SunOS、Aix、HP)中找不到这个 api。 它只支持 Linux 吗?? 最佳答案 s
我是一名优秀的程序员,十分优秀!