поведение файлового дескриптора в fork()

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

#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». Но то, что я вижу, это одно среди дочерних/родительских отпечатков «Привет», а другое - «мир».


person Anup Warnulkar    schedule 13.10.2011    source источник


Ответы (1)


Дескрипторы файлов дублируются, но дубликаты указывают на ОДИНАКОВУЮ запись в таблице системных файлов, поэтому два процесса используют один и тот же указатель файла. Функции read() и write() ядра являются атомарными, поэтому каждый процесс увидит указатель файла после того, как он был перемещен другим.

person Max    schedule 13.10.2011