我正在学习
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,它也会给出同样的结果
是的,父级和子级以几乎不可预测的顺序运行他们的代码(请记住,没有随机性),但是您的调度程序可能会在分叉后选择先调度父级,然后再调度子级。由于两者都有非常小的代码,因此父级能够运行其所有代码,然后是子级。要试验其他东西,您必须在两个进程中分叉后做更长时间的事情(例如,您将能够看到不同的输出交错)。
提示不是由您的代码产生的,而是代码的效果。当父进程终止时,运行它的 shell 会重新获得控制权并提示您输入另一个命令,同时子进程仍在工作并污染您的终端。孩子已经成为孤儿进程。为了防止这种情况,您必须通过调用...
wait()
来告诉父母等待其孩子。
我也面临同样的问题。只需向父级添加 wait(NULL) 指令即可解决该问题。据我所知,发生这种情况是因为父进程没有等待其子进程,并且子进程在这里成为没有父进程的孤儿......如果我错了,请纠正我。快乐学习