Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 5


и вызывает задержку выполнения процесса до прихода сигнала sig. Функция разрешает приход сигнала sig (обычно на него должна быть задана реакция при помощи sigset), и "засыпает" до прихода сигнала sig.

В UNIX стандарта POSIX для управления сигналами есть вызовы sigaction, sigproc-

mask, sigpending, sigsuspend. Посмотрите в документацию!

6.4.1. Напишите программу, выдающую на экран файл /etc/termcap. Перехватывайте сигнал SIGINT, при получении сигнала запрашивайте "Продолжать?". По ответу 'y' - продолжить выдачу; по 'n' - завершить программу; по 'r' - начать выдавать файл с начала: lseek(fd,0L,0). Не забудьте заново переустановить реакцию на SIGINT, поскольку после получения сигнала реакция автоматически сбрасывается.

#include <signal.h>

void onintr(sig){ /* sig - номер сигнала */ signal (sig, onintr); /* восстановить реакцию */ ... запрос и действия ... } main(){ signal (SIGINT, onintr); ... }

Сигнал прерывания можно игнорировать. Это делается так:

signal (SIGINT, SIG_IGN);

Такую программу нельзя прервать с клавиатуры. Напомним, что реакция SIG_IGN сохраняется при приходе сигнала.

6.4.2. Системный вызов, находящийся в состоянии ожидания какого-то события (read

ждущий нажатия кнопки на клавиатуре, wait ждущий окончания процесса-потомка, и.т.п.), может быть прерван сигналом. При этом сисвызов вернет значение "ошибка" (-1) и errno

станет равно EINTR. Это позволяет нам писать системные вызовы с выставлением тайма-

ута: если событие не происходит в течение заданного времени, то завершить ожидание и прервать сисвызов. Для этой цели используется вызов alarm(sec), заказывающий посылку сигнала SIGALRM нашей программе через целое число sec секунд (0 - отменяет заказ):

#include <signal.h>

void (*oldaction)(); int alarmed; /* прозвонил будильник */ void onalarm(nsig){ alarmed++; } ... /* установить реакцию на сигнал */ oldaction = signal (SIGALRM, onalarm); /* заказать будильник через TIMEOUT сек. */ alarmed = 0; alarm ( TIMEOUT /* sec */ );




Содержание  Назад  Вперед