и действующий идентификатор пользовать является
– если параметр 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;
(* Бесконечный цикл *)
Содержание Назад Вперед