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


         

Следующий пример, программа show_msg, выводит


Следующий пример, программа show_msg, выводит часть информации о статусе объекта очереди сообщений. Программа должна вызываться так:
$ show_msg значение_ключа
Программа show_msg использует библиотечную процедуру ctime для преобразования значений структуры time_t в привычную запись. (Процедура ctime и другие функции для работы с временными значениями будут обсуждаться в главе 12.) Текст программы show_msg:
(* Программа showmsg - выводит данные об очереди сообщений *)
{$mode objfpc}
uses ipc,stdio,sysutils;
procedure mqstat_print(mkey:tkey; msq_id:longint; mstat:pmsqid_ds);
begin
  writeln (#$a'Ключ ', mkey, ', msg_qid ', msq_id, #$a);
  writeln(mstat^.msg_qnum, ' сообщений в очереди'#$a);
  writeln('Последнее сообщение послано процессом ', mstat^.msg_lspid, ' в ',
         ctime(mstat^.msg_stime));
  writeln('Последнее сообщение принято процессом ', mstat^.msg_lrpid, ' в ',
         ctime(mstat^.msg_rtime));
end;
var
  mkey:tkey;
  msq_id:longint;
  msq_status:tmsqid_ds;
begin
  if paramcount<>1 then
  begin
    writeln(stderr, 'Применение: showmsg значение_ключа');
    halt(1);
  end;
  (* Получаем идентификатор очереди сообщений *)
  try
    mkey:=tkey(strtoint(paramstr(1)));
  except
    on e:econverterror do
    begin
      writeln(stderr, 'Нечисловой идентификатор очереди сообщений');
      halt (2);
    end;
  end;
 
  msq_id := msgget(mkey, 0);
  if msq_id = -1 then
  begin
    perror('Ошибка вызова msgget');
    halt(2);
  end;
  (* Получаем информацию о статусе *)
  if not msgctl(msq_id, IPC_STAT, @msq_status) then
  begin
    perror('Ошибка вызова msgctl');
    halt(3);
  end;
  (* Выводим информацию о статусе *)
  mqstat_print(mkey, msq_id, @msq_status);
  halt(0);
end.
Упражнение 8.4. Измените процедуру show_msg так, чтобы она выводила информацию о владельце и правах доступа очереди сообщений.
Упражнение 8.5. Взяв за основу программу chmod, напишите программу msg_chmod, которая изменяет связанные с очередью права доступа. Очередь сообщений также должна указываться значением ее ключа.

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