代码之家  ›  专栏  ›  技术社区  ›  James G

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

  •  2
  • James G  · 技术社区  · 8 年前

    我有一段代码来打印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 回复  |  直到 8 年前
        1
  •  5
  •   selbie    8 年前

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

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

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

    但你偶尔看到的是:

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

    尽管您的示例系列运行中没有显示,但以下顺序也是有效且可行的。

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

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

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

        2
  •  -2
  •   Achal    8 年前

    分叉过程每次打印的方式不同 ? 当你这样做的时候 fork() 第一 parent 将运行并运行 foreground 然后 child 将运行及其磨合 background . 现在,原因是您正在变得不同,因为如果前台进程已完成,则后台进程将进入前台(&显示其输出(&S);反之亦然

    如果命令提示是免费的,即如果父项完成,则子项将出现在前台&显示其输出,shell不会停止在前台执行的子进程。

    请注意 子项执行顺序(&P);父进程可能会延迟,因为它依赖于操作系统 .

    推荐文章