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



我用C编写了如下代码

#include<stdio.h>
#include<unistd.h>
int main()
{
    int id;
    id = fork();
    if(id == 0)
        printf("Child Processn");
    else if(id > 0)
        printf("Parent Processn");
    else
        perror("Unable to forkn");
        
    return 0;
}

输出如ubuntu 20 OS 所示

Parent Process
Child Process

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

进程可以按任意顺序运行,因为它们是独立调度的(正如Jonathan Leffler在评论中所说(,并且通常也在不同的CPU内核中运行。把它们想象成两个不同的浏览器窗口,可以同时播放视频/音频。

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

理论上,即使父进程等待1秒,也不能保证子进程会在父进程之前运行。

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

这不是像当我们调用fork((时,控件转到子进程,在子进程执行完其指令后,控件回到父进程。这种行为的原因就像c从上到下一个接一个地执行它的指令。我是不是错过了什么?

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

正如siride所建议的:你可以使用wait(),如果你想让父进程只在子进程之后运行,就使用这个:

#include <stdio.h>
#include <unistd.h>
int main()
{
    int id;
    id = fork();
    if(id == 0) {
        printf("Child Processn");
    } else if(id > 0) {
        wait(id); // waits until child process finishes doing its work
        printf("Parent Processn");
    } else {
        perror("Unable to forkn");
    }
        
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新