fork()到底发生了什么?

时间:2012-02-21 14:08:01

标签: c++ process fork

int main(){

    char ch;

    fork();

    cin >> c;
}

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

fork()创建子进程。

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

在另一种情况下,当孩子获得令牌并读取数据并退出时,父母仍然活着,因此再次阻止输入。

答案 3 :(得分:0)

在fork()之后加入wait()并尝试。