2011-10-13 5 views
0

子プロセスが親プロセスからforkされると、親プロセスのすべての変数が新しい子プロセスにコピーされます。したがって、フォークが起こる前に共通のファイルを開いて、親と子の両方から同じファイルを読み込もうとすると、両方とも独立して結果を出力するはずです。しかし、これを実装しようとすると、親と子のファイルからの読み込みがインターリーブされているようです。これがなぜ起こっているのかを知る必要があります。新しいプロセスが親プロセスからフォークされたときにもファイル記述子を複製する必要があります。だから何がうまくいかない?fork()内のfiledescriptorの動作

#include<stdio.h> 
#include<fcntl.h> 

main() 
{ 
int fp; 
char buff[11]; 
int pid; 
fp = open("file1.txt", O_RDONLY); 
pid = fork(); 
if(pid==0) 
{ 
    printf("Child begins %d\n", getpid()); 
    read(fp, buff, 5); 
    buff[10] = '\0'; 
    printf("Child read:"); 
    puts(buff); 
    printf("Child exiting\n"); 
} 
else 
{ 
    read(fp, buff, 5); 
    buff[10] = '\0'; 
    printf("Parent read:"); 
    puts(buff); 
    printf("Parent exiting\n"); 
} 
} 

ここで、file1.txtに内容「Hello world」があるとすると、親プロセスと子プロセスの両方に「Hello」と表示されるはずです。しかし、私が見ているのは、子/親プリント "Hello"と他のプリント "world"のうちの1つです。

答えて

1

ファイルディスクリプタは複製されますが、重複はシステムファイルテーブルのSAMEエントリを指しているため、2つのプロセスは同じファイルポインタを共有します。カーネルのread()とwrites()はアトミックなので、各プロセスはファイルポインタが他のものによって移動された後にそれを見ます。