fork() 在 linux 中给出错误的输出(反向输出)

fork() giving wrong output in linux (reverse output)

我用C写过代码如下

#include<stdio.h>
#include<unistd.h>

int main()
{
    int id;
    id = fork();
    if(id == 0)
        printf("Child Process\n");
    else if(id > 0)
        printf("Parent Process\n");
    else
        perror("Unable to fork\n");
        
    return 0;
}

输出如图ubuntu20OS

Parent Process
Child Process

我希望应该首先编写子进程,因为在调用 fork() 之后,子进程的 printf() 将被打印在屏幕上,然后父进程的 printf() 将被打印,但实际上是反向打印。请帮助我为什么不首先打印子进程的 printf(),因为子进程中的 id 为 0。

这些进程可以 运行 以任意顺序进行,因为它们是独立调度的(正如 Jonathan Leffler 在评论中所说),并且通常 运行 在不同的 CPU 核心中。将它们想象成两个不同的 浏览器 windows,可以同时播放 video/audio。

可能 sleep(1); 父进程在 fork(); 之后,如果您有子进程必须在父进程读取之前插入的任何数据。 (或任何其他原因)。

理论上,即使父进程等待1秒,也不能保证子进程运行先于父进程。

此外,为什么您希望子进程在父进程之前 运行?

Isn't it like when we call fork() control goes to child process and after child process is done executing it's instructions, control goes back to parent process. The reason for this behaviour is like c executes its instructions one by one from top to bottom. Am I missing something?

这是一个不同的过程!!!一旦子进程启动,它有一个完全不同的执行线程,fork() returns 回到父进程和子进程 运行s 自己。这就是为什么当您在父进程上调用 exit(1); 时,子进程不会退出的原因。

正如 siride 所建议的:您可以使用 wait(),如果您想让父进程仅在子进程之后 运行,请使用此选项:

#include <stdio.h>
#include <unistd.h>

int main()
{
    int id;
    id = fork();
    if(id == 0) {
        printf("Child Process\n");
    } else if(id > 0) {
        wait(id); // waits until child process finishes doing its work
        printf("Parent Process\n");
    } else {
        perror("Unable to fork\n");
    }
        
    return 0;
}