Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 2


kill( -pgrp, sig );

Вызов

kill( 0, sig );

посылает сигнал sig всем процессам, чья группа совпадает с группой посылающего процесса. Процесс может узнать свою группу:

int pgrp = getpgrp();

а может стать "лидером" новой группы. Вызов

setpgrp();

делает следующие операции:

/* У процесса больше нет управл. терминала: */ if(p_pgrp != p_pid) u_ttyp = NULL; /* Группа процесса полагается равной его ид-у: */ p_pgrp = p_pid; /* new group */

В свою очередь, управляющий терминал тоже имеет некоторую группу (t_pgrp). Это значение устанавливается равным группе процесса, первым открывшего этот терминал:

/* часть процедуры открытия терминала */ if( p_pid == p_pgrp // лидер группы && u_ttyp == NULL // еще нет упр.терм. && t_pgrp == 0 ){ // у терминала нет группы u_ttyp = &t_pgrp; t_pgrp = p_pgrp; }

Таким процессом обычно является процесс регистрации пользователя в системе (который спрашивает у вас имя и пароль). При закрытии терминала всеми процессами (что бывает при выходе пользователя из системы) терминал теряет группу: t_pgrp=0;

При нажатии на клавиатуре терминала некоторых клавиш:

c_cc[ VINTR ] обычно DEL или CTRL/C c_cc[ VQUIT ] обычно CTRL/\

драйвер терминала посылает соответственно сигналы SIGINT и SIGQUIT всем процессам группы терминала, т.е. как бы делает

kill( -t_pgrp, sig );

Именно поэтому мы можем прервать процесс нажатием клавиши DEL. Поэтому, если процесс сделал setpgrp(), то сигнал с клавиатуры ему послать невозможно (т.к. он имеет свой уникальный номер группы != группе терминала).

Если процесс еще не имеет управляющего терминала (или уже его не имеет после setpgrp), то он может сделать любой терминал (который он имеет право открыть) управляющим для себя. Первый же файл-устройство, являющийся интерфейсом драйвера терминалов, который будет открыт этим процессом, станет для него управляющим терминалом. Так процесс может иметь каналы 0, 1, 2 связанные с одним терминалом, а прерывания получать с клавиатуры другого (который он сделал управляющим для себя).




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