Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 49 стр.

UptoLike

Составители: 

49
int kill( pid_t pid, // идентификатор процесса или группы процессов
int sig ); // номер сигнала
Если pid > 0, то он указывает идентификатор одного процесса.
Если pid = 0, сигнал посылается к группе процессов, которые имеют групповой иденти-
фикатор, совпадающий с групповым идентификатором процесса, посылающего сигнал.
Если pid < 0, то сигнал посылается к группе процессов, для которых gid=abs(pid).
Для того чтобы процесс мог послать сигнал другому процессу, его эф-
фективные идентификаторы UID и GID должны либо совпадать с иденти-
фикаторами принимающего процесса, либо быть нулевыми. В последнем
случае посылающий процесс принадлежит привилегированному пользова-
телю. QNX-вызов SignalKill() расширяет возможности стандарта POSIX.
int SignalKill( uint32_t nd, // дескриптор узла сети или 0 для локального узла
pid_t pid, // pid процесса
int tid, // tid – идентификатор потока
int signo, // номер сигнала
int code, // код сигнала
int value ); // значение сигнала
С помощью этого вызова сигналы можно пересылать по сети и направ-
лять к конкретному потоку в процессе. Согласно стандарту POSIX, если
поток, принявший сигнал, завершается, то завершаются все потоки процес-
са. Это условие действует по умолчанию, но его можно изменить, опреде-
лив при создании потока флаг PTHREAD_MULTISIG_DISALLOW. При уста-
новленном флаге будет завершаться только поток, принявший сигнал, ос-
тальные потоки сохраняют свою активность. В следующем фрагменте при-
веден пример использования сигналов.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
int main( void )
{
extern void handler();
struct sigaction act;
sigset_t set;
sigemptyset( &set );
sigaddset( &set, SIGUSR1 );
sigaddset( &set, SIGUSR2 );
act.sa_flags = 0;
act.sa_mask = set; // установить маску сигналов при вызове обработчика
act.sa_handler = &handler; // установить обработчик сигнала
sigaction( SIGUSR1, &act, NULL ); // связать обработчик с сигналом SIGUSR1
kill( getpid(), SIGUSR1 ); // послать сигнал SIGUSR1
/* программа будет завершаться по SIGUSR2 */
return EXIT_SUCCESS;
}