fork(),首先运行父级,然后运行子级

时间:2015-11-09 03:43:28

标签: unix fork

我正在学习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,它也会提供同样的东西

1 个答案:

答案 0 :(得分:1)

是的父母和孩子以几乎不可预测的顺序运行他们的代码(记住没有随机性),但是您的调度程序可能在分叉之后选择先安排父母,然后安排孩子。由于两者都有一个非常小的代码,父母可以运行它的所有代码,然后运行子代码。要尝试别的东西,你必须在两个过程中分叉后做更多的事情(例如,你将能够看到不同的输出交错)。

提示不是由您的代码生成的,而是它的影响。当父进程终止时,运行它的shell会得到控制权并提示您输入另一个命令,同时子进程正在工作并污染终端。孩子已成为一个孤儿过程。为防止这种情况发生,您必须通过致电... wait()告诉父母等待其子女。

相关问题