Асинхронный ввод-вывод
Процессы могут запросить у ядра предупреждений о возможности считывания или записи при работе с файлом. В этом случае они получают сигнал SIGIO. Для этого необходимо выполнить следующие операции : 1) установить обработчик (handler) для сигнала SIGIO; 2) обеспечить прием сигнала для Process ID или Process Group ID процесса; это осуществляется посредством примитива fcntl () или ioctl (); 3) установить для процесса опцию асинхронности, используя функ- цию fcntl ().
ПРОГРАММА 9 /*Пpимеp асинхpонного чтения из файла stdin */ #include <fcntl.h>
#include <signal.h>
/*обpаботчик SIGIO */ tsigio() { char buf[80]; /*буфеp */ int nboct; /*число байт */ /*чтение из стандаpтного ввода */ nboct = read(1, buf, sizeof(buf)); buf[nboct] = '\0'; printf("buffer recu %s \n", buf); }
main() { /*установка хэндлеpа, связанного с SIGIO */ signal(SIGIO, tsigio); /*установка pежима пpинятия сигнала SIGIO пpоцессом */ fcntl(0, F_SETOWN, getpid());
/*установка pежима асихнpонного ввода-вывода для пpоцесса */ fcntl(0, F_SETFL, FASYNC); /*цикл, котоpый может быть пpеpван сигналом SIGIO ввода-вывода */ for (;;) { /*симуляция активности */ ...............
} }
Опцию асинхронной работы можно установить принудительно (флаг I_SETSIG в ioctl ()). При этом сигнал SIGPOLL посылается процессу при каждом изменении состояния, что вызывает активизацию соответствующей обработки.