父子进程使用的文件

Gok*_*tug 2 process shared-file

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>


int main( int argc, char *argv[] ){


    FILE *fptr;
    pid_t pid;

    fptr = fopen("Shared File.txt", "a");
    pid = fork();

    if( pid > 0 ){ // parent process

        int counter = 0;

        while( counter < 10 ){
            fprintf(fptr, "a");
            ++counter;
        }
        wait(NULL);
    }
    else{

        int counter = 0;

        while( counter < 5 ){
            fprintf(fptr, "b");
            ++counter;
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我执行此代码时,代码生成的文件包含此消息:bbbbbaaaaaaaaaa

每当我执行此代码时,都会收到相同的消息。为什么进程不以混洗顺序写入文件?

为什么操作系统首先尝试完成子进程?

我对消息的期望是这样的: baabbaaabaaabaa 进程之间没有连续的过渡。

ilk*_*chu 6

父子进程之间的调度已经(至少)在子进程执行时fork 系统调用如何真正工作中讨论过

但在这种情况下,还存在缓冲的问题stdio。您正在使用fprintf()写入常规文件。默认情况下,stdio缓冲输出到常规文件,直到写入足够的数据,以节省系统调用开销。在 x86 Linux 上,它通常似乎写入 4096 字节的块,但您不能指望这一点,除非您手动设置缓冲(请参阅setbuf()和朋友)。

您可以使用类似strace显示程序进行的系统调用的命令来查看这一点。

因此,虽然您无法预测哪个进程首先运行,但在这种情况下,您可以预测as 是连续写入的,s 也是连续写入的b。你只能得到bbbbbaaaaaaaaaaaaaaaaaaaabbbbb,你得到哪一个几乎取决于机会。