gpt4 book ai didi

c - 等待 fork 的 child ,直到它启动另一个程序

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:09 24 4
gpt4 key购买 nike

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

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 */

我怎样才能摆脱这种 sleep 呢?我必须确保在 THIS_POINT 之后 /sbin/daemon 已经启动。

您建议采用哪种方法?

最佳答案

如果您可以控制守护进程(这样您可以在必要时修改它),请考虑创建一个管道,并让守护进程在运行时在其标准输出(管道的写入端)上写入“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]);

如果您无法控制守护进程,您仍然可以创建管道,但您必须依靠守护进程通过关闭其标准输出来正确地 self 守护。在这种情况下,父进程将简单地从管道中读取零字节 (EOF),然后您检查 waitpid(pid, &status, WNOHANG) child 是否死亡(这也会给你 EOF)。

关于c - 等待 fork 的 child ,直到它启动另一个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25202992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com