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 进程之间没有连续的过渡。
父子进程之间的调度已经(至少)在子进程执行时和fork 系统调用如何真正工作中讨论过。
但在这种情况下,还存在缓冲的问题stdio
。您正在使用fprintf()
写入常规文件。默认情况下,stdio
缓冲输出到常规文件,直到写入足够的数据,以节省系统调用开销。在 x86 Linux 上,它通常似乎写入 4096 字节的块,但您不能指望这一点,除非您手动设置缓冲(请参阅setbuf()
和朋友)。
您可以使用类似strace
显示程序进行的系统调用的命令来查看这一点。
因此,虽然您无法预测哪个进程首先运行,但在这种情况下,您可以预测a
s 是连续写入的,s 也是连续写入的b
。你只能得到bbbbbaaaaaaaaaa
或aaaaaaaaaabbbbb
,你得到哪一个几乎取决于机会。