分叉过程每次打印的方式不同

时间:2018-04-14 15:42:21

标签: c++ fork flush

我有一段代码可以打印出一次只有Forked的PID,而且只是一个基本的用户输入内容,但每次运行脚本时,有时它会按预期运行,并且所有内容都在一个命令中打印出来,然后,当孩子下次打印它的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;
}

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

有人可以指出我出错的地方以及如何纠正它吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

您正在观察的通常情况是以下事件:

  • 父进程打印其行
  • 在后台运行的子进程打印其行
  • 命令提示符返回(作为父进程的结果) 离开)

但你偶尔观察到的是:

  • 父进程打印其行
  • 命令提示符返回(作为父进程的结果) 离开)
  • 在后台运行的子进程在命令提示符
  • 上打印其行

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

  • 在后台运行的子进程首先打印其行。
  • 父进程在子进程后打印其行
  • 命令提示符返回(作为父进程的结果) 离开)

唯一保证的因果排序是父进程打印并退出后出现的命令提示符。操作系统如何安排分叉子进程相对于父进程运行是不确定的。子进程可以在父进程的事件的前,后或之间打印。

如果要保证在子进程和父进程之间对打印语句进行排序,则需要使用跨进程同步原语来协调子进程和父进程。

答案 1 :(得分:-1)

每次分叉进程的打印方式不同?当您执行fork()时,parent将会运行foreground,然后child将会运行backgroundcustomer。现在你得到不同的原因,因为如果前台进程完成了后台进程,那么前景和显示其输出和输出反之亦然。

如果命令提示是免费的,如果父母已完成,那么孩子将来到前台&amp;显示其输出,shell不会停止在前台执行子进程。

请注意 执行child&amp;的序列父进程可以推迟依赖于操作系统