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


         

Открыть канал fifo для чтения


      fatal ('Ошибка приемника: вызов mkfifo');
  (* Открыть канал fifo для чтения и записи. *)
  fd := fdopen (fifo, Open_RDWR);
  if fd < 0 then
    fatal ('Ошибка при открытии канала fifo');
  (* Прием сообщений *)
  while true do
  begin
    if fdread (fd, msgbuf, MSGSIZ + 1) < 0 then
      fatal ('Ошибка при чтении сообщения');
    (*
     * вывести сообщение; в настоящей программе
     * вместо этого могут выполняться какие-либо
     * полезные действия.
     *)
    writeln('Получено сообщение: ', msgbuf);
  end;
end.
Обратите внимание на то, что канал
FIFO открывается одновременно для чтения и записи (при помощи задания флага Open_RDWR). Чтобы понять, для чего это сделано, предположим, что канал FIFO был открыт только для чтения при помощи задания флага Open_RDONLY. Тогда выполнение программы rcvmessage будет сразу заблокировано в момент вызова fdopen. Когда после старта программы sendmessage в канал FIFO будет произведена запись, вызов fdopen будет разблокирован, программа rcvmessage будет читать все посылаемые сообщения. Когда же канал FIFO станет пустым, а процесс sendmessage завершит работу, вызов fdread начнет возвращать нулевое значение, так как канал
FIFO уже не будет открыт на запись ни в одном процессе. При этом программа rcvmessage войдет в бесконечный цикл. Использование флага Open_RDWR позволяет гарантировать, что, по крайней мере, в одном процессе, то есть самом процессе программы rcvmessage, канал FIFO будет открыт для записи. В результате вызов open всегда будет блокироваться то тех пор, пока в канал
FIFO снова не будут записаны данные.
Следующий диалог показывает, как можно использовать эти две программы. Программа rcvmessage выполняется в фоновом режиме для получения сообщений от разных процессов, выполняющих программу sendmessage.
$ rcvmessage &
40
$ sendmessage 'сообщение 1' 'сообщение 2'
Получено сообщение: сообщение 1
Получено сообщение: сообщение 2
$ sendmessage 'сообщение номер 3'

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