libev下的ev_child实用功能
多进程场景下,作为高可靠性,高运维性的设计原则,master主进程如何掌控worker子进程的状态,是否当机,是否挂了?
lib 作为一个强大的基础设施,自然也早考虑好了这种需求,ev_child就是为此而生,为我们提供了这种可能。
首先看看样例代码:
ev_child cw;
static void child_cb (EV_P_ struct ev_child *w, int revents)
{
ev_child_stop (EV_A_ w);
printf ("process %d exited with status %x\n", w->rpid, w->rstatus);
}
static void child_cb (EV_P_ struct ev_child *w, int revents)
{
ev_child_stop (EV_A_ w);
printf ("process %d exited with status %x\n", w->rpid, w->rstatus);
}
pid_t pid = fork ();
if (pid < 0)
// error else if (pid == 0)
{
// the forked child executes here exit (1);
} else {
ev_child_init (&cw, child_cb, pid, 0);
ev_child_start (EV_DEFAULT_ &cw);
}
上面的例子 ,主进程通过pid将子进程绑定到了child_cb 事件proc 中,当子进程挂掉后,主进程就能捕捉的信号,重新创建进程,进行替补,保证工作流的正常。
测试场景:
1 主进程启动后启动一个子进程。
2 手动通过后台kill命令,kill掉子进程。
3 主进程收到信息,打印出提示。
OK,成功!