#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;
}
このコードを実行すると、コードによって生成されたファイルに次のメッセージが含まれます。 bbbbbaaaaaaaaaa
このコードを実行するたびに同じメッセージが表示されます。書き込みファイルを混在順に処理しないのはなぜですか?
オペレーティングシステムが最初にサブプロセスを終了しようとしたのはなぜですか?
メッセージに対する私の期待は次のとおりです。プロセス間の継続的な移行がないbaabbaaabaaabaa。
ベストアンサー1
父と息子の間のスケジュールは(少なくとも)子プロセスが実行されるときそしてフォークシステムコールはどのように機能しますか?。
ただし、この場合でも通常のファイルへの書き込みをstdio
使用しています。fprintf()
デフォルトでは、stdio
システムコールのオーバーヘッドを節約するのに十分なデータが書き込まれるまで、出力は通常のファイルにバッファリングされます。 x86 Linuxでは通常4096バイトのチャンクで書かれているようですが、バッファリングを手動で設定しないと期待できません(参照)setbuf()
そして友達)。
strace
プログラムによって実行されたシステムコールの表示などのコマンドを使用して、これを確認できます。
したがって、どのプロセスが最初に実行されるかを予測することはできませんが、この場合、sが連続して記録され、a
sb
も記録されることを予測できます。あなたは、bbbbbaaaaaaaaaa
またはいずれかを取得することができaaaaaaaaaabbbbb
、どちらを得るかは、ほとんど運の問題です。