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








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

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

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

Модель ненадёжной обработки сигналов

Модель ненадёжной обработки сигналов (старая модель) строится на вызове signal(), устанавливающем новую диспозицию сигнала (новую функцию-обработчик, SIG_IGN, или SIG_DFL) :

s2.cc :

#include "head.h" 
static void handler( int signo ) { 
   signal( SIGINT, handler ); 
   cout << endl << "signal #" << signo << endl; 
}; 
int main() { 
   signal( SIGINT, handler ); 
   signal( SIGSEGV, SIG_DFL ); 
   signal( SIGTERM, SIG_IGN ); 
   while( true ) pause(); 
}; 

$ ./s2 

^C 
signal #2 
^C 
signal #2 
Убито 

После установки нового обработчика сигнала (SIGINT = 2) процесс невозможно остановить по ^C, и мы останавливаем его, посылая ему с другого терминала SIGKILL = 9 :

$ ps -A | grep s2 

18364 pts/7   00:00:00 s2 

$ kill -9 18364 

Из этой же области модели ненадёжной обработки сигналов и широко используемый вызов alarm() (тайм-аут):

#include "head.h" 
int main( void ) { 
    alarm( 5 ); 
    cout << "Waiting to die in 5 seconds ..." << endl; 
    pause(); 
    return EXIT_SUCCESS; 
}; 

$ time ./s3 

Waiting to die in 5 seconds ... 
Сигнал таймера 
real	0m5.002s
user	0m0.000s
sys	0m0.003s 

На такой модели строится перехват сигнала завершения процесса для сохранения данных прежде завершения:

s4 .cc :
#include "head.h" 
static void handler( int signo ) { 
   cout << endl << "Saving data ... wait" << endl; 
   sleep( 2 ); 
   cout << " ... data saved!" << endl; 
   exit( EXIT_SUCCESS ); 
}; 
int main() { 
   signal( SIGINT, handler ); 
   while( true ) pause(); 
}; 
$ ./s4 
^C 
Saving data ... wait 
 ... data saved! 

Предыдущий раздел: Оглавление Следующий раздел:
Сигналы   Модель надёжной обработки сигналов