SIGIO
запускается, чтобы сообщить вам, что вы можете получать символы .... (это означает, что если вы сделаете системный вызов read(2)
, вы получите что-то), то есть это означает, что при попытке не будет получен сигнал. читать и данные не готовы для чтения. Как вы прочтете ниже, это не означает, что ваша система не получила никаких символов, это зависит от того, как настроена последовательная линия. Продолжить чтение ...
Ваш вопрос очень интересен, потому что сигнал отправляется только тогда, когда драйвер решает, что вы можете прочитать больше данных, и это может быть:
когда вы нажимаете клавишу возврата, если терминал находится в каноническом режиме (приготовленный или линейный режим), пока вы не передадите строку данных (или не нажмете ^D
символ), вы не сделаете входной буфер доступен для приложения.
когда вы получили VMIN
символов в необработанном режиме (если VMIN
отличается от 0
)
, когда VTIME
истекло после получения не менее VMIN
символов (после установки VMIN
, отличного от нуля)
Причина SIGIO
заключается в том, что не нужно ждать прибытия символов, чтобы их можно было обработать в обработчике сигналов. Но в этом нет особой пользы, поскольку прерывания носят асинхронный характер, и вам больше не придется помещать эти символы (после некоторой возможной асинхронной обработки) в какой-то буфер. Существует системный вызов select(2)
или poll(2)
, позволяющий вам выбирать между набором входных каналов и активировать его, как только будет доступен какой-либо вход.
Итак, в заключение, ответ: зависит .
Это зависит от того, как собран драйвер, как он настроен и с каким устройством вы работаете. SIGIO
определенно не связан с аппаратным прерыванием, которое может закончиться таким прерыванием, которое должно быть доставлено процессу, и то, как оно зависит, может зависеть от многих факторов.
Подумайте так: Если вы сделаете блокировку read(2)
, вы в какой-то момент проснетесь, потому что данные доступны, и вы можете получить некоторые данные. Тот же процесс, который пробуждает вас, потому что некоторые данные доступны, уволит вас SIGIO
, если вы настроили прием SIGIO
с. Никакой магии здесь, это процесс ... если вас разбудит драйвер, потому что ваш read(2)
больше не ждет, тот же драйвер отправит вам сигнал, но только если вы решили не игнорировать его.