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