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


         

Обратите внимание на то, что


$ 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

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