Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Linux-инструменты для Windows-программистов
Назад Библиотеки API POSIX Вперед

Сигналы

Сигналы UNIX являются специфической и важнейшей составной частью таких систем (достаточно обратить внимание на то, что без сигналов мы не смогли бы завершить ни один процесс в системе). Для начала мы посмотрим, какие сигналы в ней обрабатываются:
$ kill -l 

 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP 
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1 
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM 
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP 
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ 
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR 
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3 
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8 
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13 
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12 
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7 
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2 
63) SIGRTMAX-1	64) SIGRTMAX	

Примеры кода для этой группы находятся в архиве usignal.tgz, все примеры этого архива написаны на C++ (для разнообразия), и используют общий заголовочный файл:

head.h :

#include <iostream> 
#include <iomanip> 
using namespace std; 
#include <stdlib.h> 
#include <stdio.h> 
#include <inttypes.h> 
#include <signal.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#define _SIGMIN  SIGHUP 
#define _SIGMAX  SIGRTMAX 

Первый пример показывает как рекомендуют проверять реализован ли тот или иной сигнал в конкретной POSIX OS:

s1.cc :

#include "head.h" 
int main( int argc, char *argv[] ) { 
   cout << "SIGNO"; 
   for( int i = _SIGMIN; i <= _SIGMAX; i++ ) { 
      if( i % 8 == 1 ) cout << endl << i << ':'; 
      int res = sigaction( i, NULL, NULL ); 
      cout << '\t' << ( ( res != 0 && errno == EINVAL ) ? '-' : '+' ); 
   }; 
   cout << endl; 
   return EXIT_SUCCESS; 
}; 
$ ./s1 
SIGNO 
1:	+	+	+	+	+	+	+	+
9:	+	+	+	+	+	+	+	+
17:	+	+	+	+	+	+	+	+
25:	+	+	+	+	+	+	+	-
33:	-	+	+	+	+	+	+	+
41:	+	+	+	+	+	+	+	+
49:	+	+	+	+	+	+	+	+
57:	+	+	+	+	+	+	+	+

Предыдущий раздел: Оглавление Следующий раздел:
Загрузка нового экземпляра (процесса)   Модель ненадёжной обработки сигналов