子プロセスが親プロセスから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つです。