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


         

Вывод программы lockit может выглядеть


  fcntl (fd, F_SETLKW, longint(@my_lock));

  if linuxerror > 0 then

  begin

    perror ('parent: locking');

    halt (1);

  end;

  writeln('Родительский процесс: блокировка установлена');

  case fork of

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

    begin

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

      halt (1);

    end;

    0:               

    begin

      my_lock.l_len := 5;

      fcntl (fd, F_SETLKW, longint(@my_lock));

      if linuxerror > 0 then

      begin

        perror ('Дочерний процесс: установка блокировки');

        halt (1);

      end;

      writeln ('Дочерний процесс: блокировка установлена');

      writeln ('Дочерний процесс: выход');

      halt (0);

    end;

  end;

  (* родительский процесс *)

  sleep (5);

  (* Выход, который автоматически снимет блокировку. *)

  writeln ('Родительский процесс: выход');

  halt (0);

end.

Вывод программы lockit может выглядеть примерно так:

Родительский процесс: блокировка установлена

Родительский процесс: выход

Дочерний процесс: блокировка установлена

Дочерний процесс: выход

Обратите внимание на порядок, в котором выводятся сообщения. Он показывает, что дочерний процесс не может наложить блокировку до тех пор, пока родительский процесс не завершит работу и не снимет тем самым блокировку, в противном случае сообщение Дочерний процесс: блокировка установлена появилось бы вторым, а не третьим. Этот пример показывает, что блокировка, наложенная родительским процессом, также затронула и дочерний, хотя блокируемые участки файла и не совсем совпадали. Другими словами, попытка блокировки завершится неудачей, даже если участок файла лишь частично перекрывает уже заблокированный. Эта программа иллюстрирует несколько интересных моментов. Во-первых, блокировка информации не наследуется при вызове fork; дочерний и родительский процессы в данном примере выполняют блокировку независимо друг от друга. Во-вторых, вызов fcntl не изменяет положение указателя чтения-записи файла – во время выполнения обоих процессов он указывает на начало файла. В-третьих, все связанные с процессом блокировки автоматически снимаются при его завершении.


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