【发布时间】:2017-04-12 22:10:46
【问题描述】:
这是我的名为 server.c 的示例代码(已删除包含以保持简单)。
int main()
{
for(int i = 0; i < 10; i++) {
fork();
execl("./client", "./client", NULL);
}
if (wait(NULL) == -1)
perror("error with wait");
return 0;
}
这是从上述程序中执行的客户端代码。
int main()
{
printf("This is the child with pid = %d from parent %d", getpid(), getppid());
return 0;
}
现在让我解释一下我认为会发生什么以及我实际得到的输出。
在服务器中,我们进入 for 循环。在第一次迭代中,我们点击了 fork()。此时有两个进程,即父进程和第一个子进程。现在我们从这两个进程中执行一个名为“client”的程序。此客户端代码仅打印一些信息。所以当我运行这个服务器程序时,我应该得到两行,对吧?一条来自父母,另一条来自孩子?但是我只打印了一行,使用 strace 后我发现只有父母在打印东西,而不是孩子。那么这是为什么呢?
是不是因为孩子已经死了(这是正确的术语吗?),因为孩子已经被执行了?如果是这样,孩子会怎么样?变成丧尸了吧?它会被init收集吗?即便如此,为什么它不会在像僵尸一样结束之前打印出那一行?
【问题讨论】:
-
当我尝试你的程序时,我收到了数百条
error with wait: No child processes消息。 -
没关系,我给客户端程序起了错误的名字。当我修复它时,它按预期工作,我得到了两行输出。
-
exec()之后,程序不存在。执行的exec在父子节点中执行。循环永远不会循环(如果 exec 成功)
-
@posixking。请不要接受我的回答。这不正确,我无法删除它..