C++ fork() 在 linux 终端上看起来很奇怪

标签 c++ c linux fork

<分区>

我正在尝试在 C++ 中使用 fork()。 然而,它在终端上看起来很奇怪。

如您在屏幕截图中所见,我的代码仅输出其进程的 PID 以及它是子进程还是父进程。 但是当父进程完成时,子进程的输出会打印在新的提示符上。

最重要的是,在 who 程序完成后,它仍然在等待我的命令。

我不明白为什么它仍然在等待输入,如图所示。

My code and its output

最佳答案

fork() 不会生成“空”进程二进制文件。它创建调用进程的克隆,然后两个进程并行运行。这意味着,如果 fork 进程没有execve 进入另一个进程镜像或终止,您将以几乎相同状态的同一程序的两个拷贝同时运行而告终。它们之间的唯一区别是子进程得到一个 0 作为 fork 的返回值,而父进程看到的是子进程的 PID。

您肯定知道这些科幻故事,在这些故事中,一个人突然被复制到量子级别并遇到了他们的原作,他们开始争论谁是原作,谁是拷贝。这正是父进程和子进程在 fork 之后的情况。

And most importantly, it still waits for my command after the who program is done.

不,它没有。它在您的控制台上看起来就像这样:父进程终止,因此 shell 将打印提示。然后子进程在提示后打印它的东西。尝试在 sleep 时打电话,即

~/... > ./hw3 ; sleep 1

关于C++ fork() 在 linux 终端上看起来很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191211/

相关文章:

linux - shell 和变量中的 Expr 和日期

java - 如何在 JNI 中从 C++ 调用 Java 方法

c++ - 需要有关 STL 排序算法的帮助

c - Posix 线程程序

linux - 在 kubernetes pod 中获取日志的选项

php - 在 Linux 上本地运行初始设置后的 WordPress "Notice: Undefined index: host"

c# - 简单 3d 应用程序的最简单方法

c++ - 从基结构虚拟继承

c - 数组重新分配失败

c++ - 获取进程信息