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

问题描述 投票:0回答:2

我正在学习

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,它也会给出同样的结果

unix fork
2个回答
2
投票

是的,父级和子级以几乎不可预测的顺序运行他们的代码(请记住,没有随机性),但是您的调度程序可能会在分叉后选择先调度父级,然后再调度子级。由于两者都有非常小的代码,因此父级能够运行其所有代码,然后是子级。要试验其他东西,您必须在两个进程中分叉后做更长时间的事情(例如,您将能够看到不同的输出交错)。

提示不是由您的代码产生的,而是代码的效果。当父进程终止时,运行它的 shell 会重新获得控制权并提示您输入另一个命令,同时子进程仍在工作并污染您的终端。孩子已经成为孤儿进程。为了防止这种情况,您必须通过调用...

wait()
来告诉父母等待其孩子。


0
投票

我也面临同样的问题。只需向父级添加 wait(NULL) 指令即可解决该问题。据我所知,发生这种情况是因为父进程没有等待其子进程,并且子进程在这里成为没有父进程的孤儿......如果我错了,请纠正我。快乐学习

© www.soinside.com 2019 - 2024. All rights reserved.