Теория и практика программирования на Си в Unix

       

Сигналы: особые случаи


- Сигнал SIGCLD (или SIGCHLD)

Этот сигнал непосредственно связан с понятием процесса "зомби". Во избежание перехода процесса в это состояние, необходимо правильно управлять сигналом SIGCHLD в порождающем процессе. Пример эскизной схемы обработки:

ПРОГРАММА 6 /*обpаботка сигнала SIGHLD*/ #include <signal.h>

#ifdef BSD #include

/*обpаботка BSD, связанного с сигналом SIFHLD */ tsigchld() { union wait status; while (wait3(&status, WNOHANG, 0) > 0) continue; } #endif

main() { #ifdef BSD /*BSD : установка хэндлеpа, связанного с SIGHLD */ signal(SIGCHLD, tsigchld); /*ожидание : если сигнал SIGHLD появится во вpемя запpоса на ожидание (read,accept,write ...), следует игноpиpовать ошибку, если errno=EINTR и веpнуться к пpеpванному обpащению к системе */ #endif

#ifdef SYS5 /*System V : сигнал SIGHLD игноpиpуется */ signal(SIGCLD, SIG_IGN); #endif }

- Сигнал SIGALARM

Этот сигнал служит для реализации временных задержек (timeouts). Продолжительность задержки задается примитивом alarm () или setitimer (). По истечении заданного времени процессу посылается сигнал SIGALARM.

ПРОГРАММА 7 /*Использование сигнала SIGALRM для упpавления задеpжкой */ #include <signal.h>

/*обpаботчик сигнала SIGALRM */ tsigalrm() { printf("timeout lecture\n"); exit(1); }

main() { char buf[80]; /*буфеp */ int nboct; /*установка хэндлеpа, связанного с SIGALRM */ signal(SIGALRM, tsigalrm); /*цикл чтения символов или выход по тайм-аут*/ for (;;) { /*установка вpеменной задеpжки в 10 секунд */ alarm(10); nboct = read(1, buf, sizeof(buf)); buf[nboct] = '\0'; printf("buffer recu %s \n", buf); } }

- Сигнал SIGIO (или SIGPOLL)

Он позволяет получить предупреждение о том, что считывание или запись для дескриптора ввода-вывода осуществимы. Мы вернемся к нему тогда, когда речь пойдет об асинхронном вводе-выводе.



Содержание раздела