C `fork()`子系统以相反的顺序执行

C `fork()`子系统以相反的顺序执行,c,process,fork,C,Process,Fork,我有一个类似的代码: for (i = 0; i < 3; i++) { pid = fork(); if (pid == 0) { son_function(); } if (pid < 0) { exit(1); } } void son_function(void) { printf("my pid=%d\n", getpid()); printf("%d: alpha

我有一个类似的代码:

for (i = 0; i < 3; i++)
{
    pid = fork();

    if (pid == 0)
    {
        son_function();
    }

    if (pid < 0)
    {
        exit(1);
    }
}

void son_function(void)
{
    printf("my pid=%d\n", getpid());
    printf("%d: alpha\n", getpid());
    printf("%d: beta\n", getpid());
    printf("%d: charlie\n", getpid());
    exit(0);
}
(i=0;i<3;i++)的

{
pid=fork();
如果(pid==0)
{
son_函数();
}
if(pid<0)
{
出口(1);
}
}
void子函数(void)
{
printf(“我的pid=%d\n”,getpid());
printf(“%d:alpha\n”,getpid());
printf(“%d:beta\n”,getpid());
printf(“%d:charlie\n”,getpid());
出口(0);
}
由于某种原因,我无法理解,
son\u function()
的执行顺序是相反的。我的意思是,
son\u function()
正在从最大到最小打印
PID
数字

另一件让我感到奇怪的事情是,每个儿子的指纹都会一个接一个地出现,不可能两个不同过程中的两个指纹同时打印到屏幕上


这里可以看到示例:

至少在Windows和Linux下,多个进程可以同时输出到控制台

您可能会先看到一个进程的所有进程,然后再看到其他进程的原因是特定操作系统调度线程的方式。了解这种行为的更好方法是将son_函数改为下面的代码,每个孩子睡不同的时间。行被交错的原因(如前所述)是因为printf缓冲了输出行

void son_function()
{
    srandom(getpid());
    int sleepTime = random() % 4; // random sleep between 0 and 3 seconds
    printf("pid [%d] sleep time is %d\n", getpid(), sleepTime);

    printf("my pid = %d\n", getpid());
    sleep(sleepTime);
    printf("alpha = %d\n", getpid());
    sleep(sleepTime);
    printf("beta = %d\n", getpid());
    sleep(sleepTime);
    printf("charlie = %d\n", getpid());
    sleep(sleepTime);
}

要以正确的顺序执行子进程,只需在调用fork函数之前在循环中添加wait函数

因此,它将等待子进程终止,并且子进程将以正确的顺序终止

      for (i = 0; i < 3; i++)

            wait();
            pid = fork();
(i=0;i<3;i++)的

等待();
pid=fork();

添加wait函数后执行代码。

getpid()
返回调用进程的进程ID。您可能不应该期望变量
pid
和函数
getpid()
之间有任何关联。使用一个pid数组,即
pid\u t pid[3]。然后通过查看唯一元素(pid[0],…)来跟踪它们。您必须详细说明最后一段。C中的IO流被缓冲,每个换行符发送隐式刷新。每个进程都有自己的流缓冲区。在修复过多的语法和逻辑错误以使您的文章真正可编译之后,将生成一个示例输出。注意前两个PID。您有一个竞争条件。所有子进程都独立运行,它们到达
printf
指令的顺序未指定。如果希望子进程按特定顺序执行
printf
,则需要使用同步。您的分叉速度太快,以至于在分叉完成之前,所有子进程都没有机会运行。然后,他们同时开始比赛,没有人比其他人领先。那么为什么在控制台的打印中没有碰撞呢?为什么i.e.child-1在其打印之间没有任何其他孩子(即child-2)以正确的顺序打印?