微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的控制台看起来像是在使用 fork() 创建 3 个孩子后执行了命令?

如何解决为什么我的控制台看起来像是在使用 fork() 创建 3 个孩子后执行了命令?

好的,所以要么我有这个奇怪的错误,要么只是我的一个错误,我不需要担心。无论如何,我正在处理一项我需要分叉 3 次的任务,我在这里有一些快速的虚拟代码

for(int x = 0; x < 3; x++) {
    procID = fork();
    if (procID == 0) {
        sleep(3);
        printf("child process: \n");
        exit(0);
    }

}

这是我想要/需要的输出

y@y:~/Desktop/playground$ ./a
child process
child process
child process
y@y:~/Desktop/playground$

但这是我得到的输出

y@y:~/Desktop/playground$ gcc a.c -o a -lm
y@y:~/Desktop/playground$ ./a
y@y:~/Desktop/playground$ child process
child process
child process

包含问题的那一行是:y@y:~/Desktop/playground$ child process

为什么它会自动使它看起来好像我在控制台中输入了命令 y@y:~/Desktop/playground$ 子进程。我正在深入研究它并试图自己解决这个问题,但显然我不能自己做到这一点。我知道,一旦最后一个父母退出,那么“y@y:~/Desktop/playground$”就会被放入控制台,我能做些什么来强迫父母等到孩子们完成执行?或者这里还有其他东西在起作用吗?

解决方法

为什么它会自动让它看起来好像我输入了命令 [..]

它没有。你看到的是你的 shell 提示。

原因是您没有从父进程调用 wait(2) 让所有子进程退出。因此,当父母在一个或多个孩子之前退出时,您会观察到这种行为。

我能做些什么来强迫父母等到 孩子们执行完了吗?

在 for 循环之后的循环中调用 wait(NULL);,以便父进程等待所有子进程:

while (wait(NULL) > 0);
,

所以wait(NULL)确实是我需要做的。如果你遇到同样的问题,你需要等待(NULL);与您拥有的孩子数量相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。