Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ <b>./alarm</b>
alarm application starting
waiting for alarm to go off
<5 second pause>
Ding!
done $
В этой программе вводится новая функция
pause
<b>#include <unistd.h></b>
<b>int pause(void);</b>
Функция возвращает -1 (если следующий полученный сигнал не вызвал завершения программы) с переменной
errno
EINTR
sigsuspend
Как это работает
Программа имитации будильника запускает новый процесс вызовом
fork
SIGALRM
SIGALRM
printf
Применение сигналов и приостановка выполнения — важные составляющие программирования в ОС Linux. Это означает, что программа необязательно должна выполняться все время. Вместо того чтобы долго работать в цикле, проверяя, не произошло ли событие, она может ждать его наступления. Это особенно важно в многопользовательской среде, где процессы совместно используют один процессор, и такой вид деятельного ожидания оказывает большое влияние на производительность системы. Особая проблема, связанная с сигналами, заключается в том, что вы никогда не знаете наверняка, что произойдет, если сигнал появится в середине системного вызова? (Ответ весьма неудовлетворительный: все зависит от ситуации.) Вообще следует беспокоиться только о "медленных" системных вызовах, таких как считывание с терминала, когда системный вызов может вернуться с ошибкой, если сигнал появится во время его пребывания в режиме ожидания. Если вы начнете применять сигналы в своих программах, нужно учитывать, что некоторые системные вызовы могут закончиться аварийно, если сигнал создаст ошибочную ситуацию, которую вы могли не принимать во внимание до того, как добавили обработку сигналов.
Нужно тщательно программировать сигналы, потому что существует ряд "состояний гонок", возникающих в программах, применяющих сигналы. Например, если вы намерены вызвать pause для ожидания сигнала и этот сигнал возникнет до вызова pause, ваша программа может ждать неопределенно долго события, которое не произойдет. Новоиспеченный программист сталкивается с множеством таких состояний гонок, важных проблем синхронизации или согласования времени. Всегда очень внимательно проверяйте программный код, использующий сигналы.
Мы рассмотрели подробно возбуждение и перехват сигналов с помощью
signal
sigaction
<b>#include <signal.h></b>
<b>int sigaction<int sig, const struct sigaction *act, struct sigaction *oact);</b>
Структура
sigaction
sig
void (*)(int)sa_handler /* функция, SIG_DFL или SIG_IGN */
sigset_t sa_mask /* сигналы, заблокированные для sa_handler */
int sa_flags /* модификаторы действий сигнала */
Функция
sigaction
sig
oact
null
sigaction
oact
act
null
sigaction
act
null
Как и функция
signal
sigaction
errno
EINVAL
В структуре
sigaction
act
sa_handler
sig
func
signal
SIG_IGN
SIG_DFL
sa_handler
Поле
sa_mask
sa_handler
sa_mask
Однако сигналы, захватываемые обработчиками, заданными в структуре
sigaction
sa_flags
SA_RESETHAND
signal
sigaction
sigaction
signal