等待分叉的孩子,直到它启动另一个程序

时间:2014-08-08 11:56:44

标签: c process exec fork wait

我正在尝试从我自己开始另一个进程(守护进程):

pid_t pid=fork();
if (pid==0) { /* child */
    static char *argv[]={NULL};
    execv("/sbin/daemon", argv);
    exit(127); /* only if execv fails */
}
/* parent */
sleep(5); /* ugly way to wait for /sbin/daemon */
/* THIS_POINT */

我怎样摆脱这种睡眠?我必须确保在THIS_POINT之后/sbin/daemon已经开始。

你会建议采用什么方法?

1 个答案:

答案 0 :(得分:2)

如果您可以控制守护进程(因此可以根据需要进行修改),请考虑创建一个管道,让守护进程写入" OK"在它的标准输出(管道的写入端)运行时(然后关闭它)。您的父进程从管道读取并知道守护程序正在运行,如果它得到" OK"。 OK之后加入换行符是明智的;重要的是要记住,读取的数据不会被终止。

int fd[2];
if (pipe(fd) != 0) { …report error… }
pid_t pid=fork();
if (pid < 0) { …report error… }
if (pid == 0)
{
    static char *argv[] = { "/sbin/daemon", NULL };
    dup2(fd[1], FILENO_STDOUT);
    close(fd[0]);
    close(fd[1]);
    execv(argv[0], argv);
    exit(127);
}
close(fd[1]);
char buffer[16];
if (read(fd[0], buffer, sizeof(buffer)) >= 2 && memcmp(buffer, "OK", 2) == 0)
    …daemon started successfully…
else
    …daemon failed…
close(fd[0]);

如果您无法控制守护程序,您仍然可以创建管道,但是您必须通过关闭其标准输出来依赖守护程序守护自身。在这种情况下,父进程只需从管道中读取零字节(EOF),然后用waitpid(pid, &status, WNOHANG)检查孩子是否死亡(这也会给你EOF)。