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


         

и действующий идентификатор пользовать является


–        если параметр pid равен –1 и действующий идентификатор пользовать является идентификатором суперпользователя, то сигнал посылается всем процессам, кроме определенных системных процессов (последнее исключение относится ко всем попыткам послать сигнал группе процессов, но наиболее важно это в данном случае);
–        и, наконец, если параметр pid меньше нуля, но не равен –1, то сигнал посылается всем процессам, идентификатор группы которых равен модулю pid, включая пославший сигнал процесс, если для него также выполняется это условие.
Следующий пример – программа synchro создает два процесса, которые будут поочередно печатать сообщения на стандартный вывод. Они синхронизирут свою работу, посылая друг другу сигнал SIGUSR1 при помощи вызова kill.
 (* Программа synchro -- пример использования вызова kill *)
uses linux,stdio;
const
  ntimes:integer=0;
procedure p_action(sig:integer);cdecl;
begin
  inc(ntimes);
  writeln ('Родительский процесс получил сигнал ', ntimes, ' раз(а)');
end;
procedure c_action(sig:integer);cdecl;
begin
  inc(ntimes);
  writeln ('Дочерний процесс получил сигнал ', ntimes, ' раз(а)');
end;
var
  pid, ppid:longint;
  pact, cact:sigactionrec;
begin
  (* Задать обработчик сигнала SIGUSR1 в родительском процессе *)
  pact.handler.sh := @p_action;
  sigaction (SIGUSR1, @pact, nil);
  pid := fork;
  case pid of
    -1:               (* ошибка *)
    begin
      perror ('synchro');
      halt(1);
    end;
    0:                (* дочерний процесс *)
    begin
      (* Задать обработчик в дочернем процессе *)
      cact.handler.sh := @c_action;
      sigaction (SIGUSR1, @cact, nil);
      (* Получить идентификатор родительского процесса *)
      ppid := getppid;
      while true do
      begin
        sleep (1);
        kill (ppid, SIGUSR1);
        pause;
      end;
      (* Бесконечный цикл *)

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