我正在学习fork()
,但在我的ubuntu中出现了问题。即时运行此代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("--beginning of program\n");
int counter = 0;
pid_t pid = fork();
if (pid == 0)
{
// child process
int i = 0;
for (; i < 5; ++i)
{
printf("child process: counter=%d\n", ++counter);
}
}
else if (pid > 0)
{
// parent process
int j = 0;
for (; j < 5; ++j)
{
printf("parent process: counter=%d\n", ++counter);
}
}
else
{
// fork failed
printf("fork() failed!\n");
return 1;
}
printf("--end of program--\n");
return 0;
}
我知道父母和孩子应该没有特定的顺序运行他们的代码,所以代码应该返回这样的代码:
-beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
child process: counter=1
parent process: counter=4
child process: counter=2
parent process: counter=5
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
但每次我运行程序时,它们都会以相同的顺序运行。这是我每次运行这个程序时得到的内容的捕获:
user@user-VirtualBox:~/Documents/S-O$ ./sample
--beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
parent process: counter=4
parent process: counter=5
--end of program--
user@user-VirtualBox:~/Documents/S-O$
child process: counter=1
child process: counter=2
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
似乎父母先完成,然后孩子开始。但我想这不是真的。请注意,程序本身会打开第二个shell提示符。对可能发生的事情的任何想法?
如果我放sleep(1)
它就可以了。我仍然认为没有延迟它不应该总是有相同的执行顺序。即使数到100,它也会提供同样的东西
答案 0 :(得分:1)
是的父母和孩子以几乎不可预测的顺序运行他们的代码(记住没有随机性),但是您的调度程序可能在分叉之后选择先安排父母,然后安排孩子。由于两者都有一个非常小的代码,父母可以运行它的所有代码,然后运行子代码。要尝试别的东西,你必须在两个过程中分叉后做更多的事情(例如,你将能够看到不同的输出交错)。
提示不是由您的代码生成的,而是它的影响。当父进程终止时,运行它的shell会得到控制权并提示您输入另一个命令,同时子进程正在工作并污染终端。孩子已成为一个孤儿过程。为防止这种情况发生,您必须通过致电... wait()
告诉父母等待其子女。