Библиотека сайта rus-linux.net
Цилюрик О.И. 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!
Предыдущий раздел: | Оглавление | Следующий раздел: |
Сигналы | Модель надёжной обработки сигналов |