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



         

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


/p>

Следующий пример, программа 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, которая изменяет связанные с очередью права доступа. Очередь сообщений также должна указываться значением ее ключа.




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