当您因为子进程状态变更而收到SIGCHLD
的时候, 注册的ev_child
则会触发.
在进入事件循环之前调用fork
后注册ev_child
, 然在运行事件循环期间就可以工作的很好. 但如果在运行时间循环期间fork
后在注册ev_child
则不行.
并且, 只有默认事件循环能够处理此信号, 因此只能在默认事件循环中注册ev_child
。
一旦默认的事件循环初始化, Libev
就能捕获到SIGCHILD
. 即使第一个子进程退出后才启动ev_child
, 这样中初始化顺序对保证正确性重要.
SIGCHLD
的接收一定是异步的. 但是为了让其作为事件循环一部分, 进程状态获取则是同步的. Libev
会接收到所有子进程的信号, 无论您是否关注它们的状态.
Libev
没有提供重写内置SIGCHILD
处理的特殊支持, 虽然您可以通过自行注册SIGCHILD
处理程序.
但是我建议您最好使用Libev
基于事件的机制来处理, 这样您不必再为单独为它做额外的工作了.
ev_child
目前为止! 即使子进程终止或者退出ev_child
也不会主动退出, 通常需要手动调用来停止运行.
但是在未来的版本可能会在检测的子进程退出后自动停止ev_child
, 并且ev_child_stop
调用多次不是问题.
配置
ev_child
观察pid
指向的子进程ID的状态变化.可以在回调函数里通过观察rstatus
成员来查看状态(使用sys/wait.h
中的宏并查看您的系统waitpid
文档),rpid
成员包含了导致变换的进程ID
.trace
则必须是0
或者1
.trace
为0
表示仅关注进程终止的状态.trace
为1
表示仅关注进程暂停、继续的状态.
表示关注的
pid
; 为0
表示监视所有子进程.
表示检测到状态变更的子进程
ID
.
导致的进程退出/跟踪状态.(更多内容请参阅
sys/wait.h
与waitpid
的文档).
启动子进程后在1秒后退出, 主进程收到退出后打印消息也退出:
1 | // 只需导入单个头文件 |