Я использую канал, чтобы прочитать вывод функции, передав ей дескриптор файла. Для асинхронного чтения выходных данных я устанавливаю конец канала «чтение» в режиме ASYNC NON BLOCKING и настраиваю обработчик ввода-вывода с помощью SIGACTION. Мой код выглядит следующим образом:
struct sigaction io_act;
struct sigaction io_act_old;
sigset_t block_mask;
/* create the pipe */
pipe (pipe_fd);
/* set the reading end of pipe in ASYNC mode */
fcntl (pipe_fd[0], F_SETOWN, getpid());
fcntl (pipe_fd[0], F_SETFL, O_ASYNC | O_NONBLOCK);
/* add an I/O handler for SIGIO */
sigemptyset (&block_mask);
io_act.sa_handler = sigio_handler;
io_act.sa_mask = block_mask;
io_act.sa_flags = SA_RESTART;
sigaction (SIGIO, &io_act, &io_act_old);
/* executing the function that generate output in given FILEDES */
my_generate_output (pipe_fd[1]);
close(pipe_fd[1]);
/* this sleep should not be needed (subject of question) */
sleep(1);
close (pipe_fd[0]);
/* restore previous signal handler */
sigaction (SIGIO, &io_act_old, NULL);
Проблема в том, что если я пропущу вызов функции ожидания, я могу закрыть канал и отключить обработчик SIGIO до завершения вывода. Следствием этого является то, что приложение прерывается из-за необработанного сигнала SIGIO (сообщение «Возможен ввод / вывод»).
Как я могу убедиться, что весь вывод был прочитан из канала перед отключением обработчика SIGIO?