Системное программирование в UNIX средствами Free Pascal




Вызов fork, файлы и данные - часть 2


  case pid of

    1:                (* ошибка *)

      fatal ('Ошибка вызова fork ');

    0:                (* потомок *)

    begin

      printpos ('Дочерний процесс до чтения', fd);

      fdread (fd, buf, 10);

      printpos ('Дочерний процесс после чтения', fd);

    end;

    else              (* родитель *)

    begin

      wait(nil);

      printpos ('Родительский процесс после ожидания', fd);

    end;

  end;

end.

Процедура printpos просто выводит текущее положение в файле, а также короткое сообщение. Ее можно реализовать следующим образом:

 (* Вывести положение в файле *)

procedure printpos(_string:pchar;filedes:integer);

var

  pos:longint;

begin

  pos := fdseek (filedes, 0, SEEK_CUR);

  if pos=-1 then

    fatal ('Ошибка вызова lseek');

  writeln(_string,':',pos);

end;

После запуска этого примера получены результаты, которые убедительно подтверждают то, что указатель чтения-записи совместно используется обоими процессами:

До вызова fork:10

Дочерний процесс до чтения:10

Дочерний процесс после чтения:20

Родительский процесс после ожидания:20

Упражнение 5.5. Напишите программу, показывающую, что значения переменных программы в родительском и дочернем процессах первоначально совпадают, но не зависят друг от друга.

Упражнение 5.6. Определите, что происходит в родительском процессе, если дочерний процесс закрывает файл, дескриптор которого он унаследовал после ветвления. Другими словами, останется ли файл открытым в родительском процессе или же будет закрыт?




Содержание  Назад  Вперед