int main(){
char ch;
fork();
cin >> c;
}
在调用fork()之后,我应该有2个运行相同代码的确切进程。为什么在运行这个简单的例子之后,我被要求只输入一次字符,要么两次?我运行这个程序时,系统不应该期望每次输入2个输入吗?
>./a.out
a
>./a.out
a
b
>
答案 0 :(得分:6)
您有两个进程同时从终端读取。任何人都猜测哪个进程得到了输入。
如果您有两个进程从同一终端读取,则不应期望一致的行为。
答案 1 :(得分:2)
当调用fork()时,操作系统通常会复制正在执行的程序的整个内存空间(排序)。两个程序然后运行。唯一的区别是在“new”进程中,fork()返回0,而在“old”进程中它返回新进程的进程ID。
您只需要输入一个输入的原因是其中一个程序在后台运行。命令行shell一次只对一个进程执行I / O.
答案 2 :(得分:1)
fork()创建子进程。
但是哪个进程(在父级和新生的子级中)得到CPU切片是不确定的。当两个进程都被阻止进行键盘输入时,子进程或父进程都可以获得输入。
如果父获取令牌,它将输入读入其地址空间中定义的变量并退出。孩子从来没有机会从输入中读取。然后,这个孤立的子进程将被'root'进程采用(pid = 1)。请参阅ps
输出。
在另一种情况下,当孩子获得令牌并读取数据并退出时,父母仍然活着,因此再次阻止输入。
答案 3 :(得分:0)
在fork()之后加入wait()并尝试。