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



         

Описание - часть 2


$ sendmessage 'текст сообщения 1' 'текст сообщения 2'

Обратите внимание на то, что каждое сообщение заключено в кавычки и поэтому считается просто одним длинным аргументом. Если не сделать этого, то каждое слово будет рассматриваться, как отдельное сообщение. Программа sendmessage имеет следующий исходный текст:

(* Программа sendmessage - пересылка сообщений через FIFO *)

uses linux,stdio,strings;

const

  MSGSIZ=63;

  fifo  = 'fifo';

var

  fd,j:integer;

  nwrite:longint;

  msgbuf:array [0..MSGSIZ] of char;

begin

  if paramcount=0 then

  begin

    writeln (stderr, 'Применение: sendmessage сообщение');

    halt (1);

  end;

  (* Открыть канал fifo, установив флаг Open_NONBLOCK *)

  fd := fdopen (fifo, Open_WRONLY or Open_NONBLOCK);

  if fd < 0 then

    fatal ('Ошибка вызова open для fifo');

  (* Посылка сообщений *)

  for j := 1 to paramcount do

  begin

    if length(paramstr(j)) > MSGSIZ then

    begin

      writeln('Слишком длинное сообщение ', paramstr(j));

      continue;

    end;

    strpcopy(msgbuf, paramstr(j));

    nwrite := fdwrite (fd, msgbuf, MSGSIZ + 1);

    if nwrite = -1 then

      fatal ('Ошибка записи сообщения');

  end;

  halt(0);

end.

И снова для вывода сообщений об ошибках использована процедура fatal. Сообщения посылаются блоками по 64 байта при помощи не блокируемого вызова fdwrite. В действительности текст сообщения ограничен 63 символами, а последний символ является нулевым.

Программа rcvmessage принимает сообщения при помощи чтения из канала FIFO. Она не выполняет никаких полезных действий и служит только демонстрационным примером:

(* Программа rcvmessage - получение сообщений из канала fifo *)

uses linux,stdio;

const

  MSGSIZ=63;

  fifo  = 'fifo';

var

  fd:integer;

  msgbuf:array [0..MSGSIZ] of char;

begin

  (* Создать канал fifo, если он еще не существует *)

  if not mkfifo (fifo, octal(0666)) then

    if linuxerror <> Sys_EEXIST then




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