поведение файлового дескриптора в fork () - PullRequest
0 голосов
/ 13 октября 2011

Когда дочерний процесс разветвляется от родительского процесса, все переменные родительского процесса копируются в новый дочерний процесс. Следовательно, когда мы открываем общий файл до того, как произойдет разветвление, и пытаемся прочитать один и тот же файл как из родительского, так и из дочернего элементов, оба должны вывести результаты независимо. Но когда я пытаюсь реализовать это, чтение из файла для родителя и ребенка, кажется, чередуется. Нужно знать, почему это происходит. Даже файловый дескриптор должен дублироваться, когда новый процесс разветвляется от родителя. Так что же не так?

#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 голос
/ 13 октября 2011

Дескрипторы файлов дублируются, но дубликаты указывают на одну и ту же запись в таблице системных файлов, поэтому два процесса используют один и тот же указатель файла. Ядра read () и write () являются атомарными, поэтому каждый процесс будет видеть указатель файла после того, как он был перемещен другим.

...