分叉一个进程每次打印都不同

Forking a process prints differently each time

我有一段代码可以打印出分叉后的 PID,这只是一个基本的用户输入内容,但每次我 运行 脚本,有时它 运行 就像预期的那样,它all 在一个命令中打印出来,然后下一次 child 打印它的 PID 时,它会在下一行打印并使终端处于需要按 enter 键才能继续的状态。我已经研究过这个网站,关于人们在什么情况下不会脸红,我已经在每个地方添加了这个,但我仍然无法让它工作。

我的代码:

#include <unistd.h>
#include <stdio.h>
#include "sys/types.h"
int main(){
int pid;
int userInput;

    printf("Please enter a number: ");
    userInput = getchar();

    printf("\nYou entered: ");
    putchar(userInput);
    printf ("\n");
    fflush(0);

    pid = fork();
    if (0 == pid)
    {
        printf ("I am the child process, my PID is %d \n", getpid());
        fflush(0);
    }
    else
    {
        printf ("I am the parent process, my PID is %d \n", getpid());
        fflush(0);
    }
return 0;
}

这就是我 运行 几次时发生的情况:

有人可以指出我哪里做错了以及如何改正吗?

谢谢!

因为父进程和子进程之间无法保证调度和优先级。

您观察到的常见情况是以下事件:

  • 父进程打印它的行
  • 在后台 运行s 的子进程打印它的行
  • 命令提示符returns(作为父进程的结果 退出)

但您偶尔观察到的是:

  • 父进程打印它的行
  • 命令提示符returns(作为父进程的结果 退出)
  • 在后台 运行 的子进程在命令提示符的顶部打印它的行 -

虽然您的 运行 系列示例中未显示,但以下序列也是有效且可能的。

  • 在后台 运行 的子进程首先打印它的行。
  • 父进程在子进程之后打印它的行
  • 命令提示符returns(作为父进程的结果 退出)

唯一可以保证的因果顺序是在父进程打印其行并退出后出现的命令提示符。 OS 相对于父进程如何将分叉子进程调度到 运行 是不确定的。子进程可以首先打印、最后打印或在父进程的事件之间打印。

如果你想保证子进程和父进程之间打印语句的顺序,你需要使用跨进程同步原语来协调子进程和父进程。

分叉进程每次打印都不同?当您执行 fork() 时,第一个 parent 将 运行 并且它 运行 在 foreground 中然后 child 将 运行 及其 运行 在 background 中。现在你得到不同的原因是,如果前台进程完成后台进程来到前台并显示其输出,反之亦然。

如果命令提示符空闲,即如果父进程完成,那么子进程将来到前台并显示其输出,shell 不会停止在前台执行的子进程。

请注意,子进程和父进程的执行顺序可能会延迟,因为其 OS 依赖.