fork() 到底发生了什么

What exactly happens with fork()?

本文关键字:发生了 什么 fork      更新时间:2023-10-16
int main(){
    char ch;
    fork();
    cin >> c;
}

调用 fork(( 后,我应该有 2 个确切的进程运行相同的代码。为什么在运行这个简单示例后,我被要求只输入一个字符一次,要么两次?每次运行此程序时,系统不应该期望 2 个输入吗?

>./a.out 
a
>./a.out
a
b
>

您有两个进程同时从终端读取。 任何人都可以猜测哪个进程获得输入。

  • 如果父进程首先获取输入,它将退出并将控制权返回给 shell。 (请注意,这实际上会导致相同情况的重复,shell 和子进程争夺输入。
  • 如果子进程首先获取输入,它将退出,但在父进程退出之前,控件不会返回到 shell。

如果有两个进程从同一终端读取,则不应期望一致的行为。

当调用fork((时,操作系统通常会复制正在执行的程序的整个内存空间(有点(。然后,两个程序都会运行。唯一的区别是,在"新"进程中,fork(( 返回 0,而在"旧"进程中,它返回新进程的进程 ID。

只要求您输入一个输入的原因是其中一个程序在后台运行。命令行外壳一次只对一个进程执行 I/O。

fork(( 创建一个子进程。

但是哪个进程(在父进程和新生子项之间(获得CPU切片尚未确定。当两个进程都被阻止键盘输入时,子进程或父进程都可以获取输入。如果父级获取令牌,它将输入读入其地址空间中定义的变量并退出。孩子从来没有机会从输入中阅读。然后,这个孤立的子进程将被"根"进程(pid=1(采用。请参阅ps输出。

在另一种情况下,子项获取令牌并读取数据并退出,父项仍处于活动状态,因此再次阻止输入。

在fork((之后包含一个wait((并尝试。