Обработчик запускающего сигнала для ввода / вывода - PullRequest
3 голосов
/ 29 марта 2010

Используя C в Linux, как бы я запускал обработчик сигнала каждый раз, когда записывал данные в буфер с помощью функции write (). Обработчик будет читать все данные, записанные в буфер во время выполнения.

Ответы [ 4 ]

4 голосов
/ 30 марта 2010

Сокеты поддерживают это, включив асинхронный режим в дескрипторе файла сокета. В Linux это делается с помощью вызовов fcntl:

/* set socket owner (the process that will receive signals) */
fcntl(fd, F_SETOWN, getpid());

/* optional if you want to receive a real-time signal instead of SIGIO */
fnctl(fd, F_SETSIG, signum);

/* turn on async mode -- this is the important part which enables signal delivery */
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC);
2 голосов
/ 29 марта 2010

Я не на 100% понимаю, что вы пытаетесь сделать, НО выберите может быть то, что вам нужно. ожидание записи данных в файл / канал. Вы можете использовать его для симуляции асинхронного ввода-вывода.

2 голосов
/ 29 марта 2010

Используйте pipe() с O_ASYNC, и вы получите SIGIO на конце чтения канала при появлении новых данных в канале.

0 голосов
/ 29 марта 2010

Если файловый дескриптор, используемый с write(), не предназначен для FIFO, канал (, как предложено Кеном Блумом ), асинхронный сокет (, как предложено mark4o ) и не вызывает сигнала (т. Е. SIGIO), я полагаю, вы могли бы использовать raise() для отправки сигнала текущему процессу после записи данных в буфер. В зависимости от того, чего вы на самом деле пытаетесь достичь, это может быть не лучшим решением.


Обновление

Если я вас правильно понимаю, вы хотите записать в файл, сгенерировать сигнал SIGIO по завершении записи, а затем прочитать данные обратно из обработчика сигнала. Кажется, вы хотите использовать асинхронный ввод / вывод для файла.

В Асинхронный ввод / вывод в Linux или: Добро пожаловать в ад , автор описывает различные методы асинхронного ввода / вывода в Linux, включая использование сигнала SIGIO. Техника сигналов SIGIO не может использоваться с обычными файлами.

Несмотря на то, что автор ранее упомянутой статьи не особо задумывался о POSIX AIO API, предоставляемом в ядре 2.6, вы все равно можете рассмотреть его, так как он может использоваться для уведомления о завершении асинхронного чтения / записи. в обычный файл с помощью сигналов и обратных вызовов функций.

В Повышение производительности приложений с помощью асинхронного ввода-вывода . Автор представляет обзор основных моделей ввода-вывода Linux, прежде чем вводить API-интерфейс AIO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...