1.Сигналы:
Использование сигналов, как отмечали многие другие, будет работать.Однако, как отмечали многие другие, этот подход имеет свои недостатки.
2.Select ():
Используя select () (или другую функцию мультиплексирования), вы можете заблокировать ожидание поступления данных из более чем одного файлового дескриптора и указать время ожидания.
Используйте тайм-аут в ваших интересах.Всякий раз, когда select () возвращает, проверьте глобальную переменную, чтобы увидеть, если вы должны завершить.Если вы хотите немедленной реакции, продолжайте читать.
3.Выберите () и каналы:
Несколько fds означает, что вы можете ждать поступления данных через указанное вами устройство и, скажем, канал.
Прежде чем создавать поток, создайтетрубу, а затем включите блок нитей в select (), контролируя как устройство, так и трубу.Всякий раз, когда вы хотите разблокировать, выберите, есть ли у устройства новые данные или нет, отправьте байт по каналу.
Если select () сообщает, что он разблокирован из-за данных, поступающих по каналу, вы можете очистить и прекратить работу,Обратите внимание, что этот метод гораздо более гибкий, чем метод сигнализации, поскольку вы можете, помимо простого использования канала в качестве метода пробуждения, использовать его для передачи полезной информации или команд.
4.Выберите (), каналы и сигналы:
Если вы используете несколько процессов и не хотите / не можете обойти канал, вы можете объединить оба решения.Создайте канал и установите обработчик сигнала, скажем, для SIGUSR1.В обработчике сигнала отправьте байт по каналу.
Всякий раз, когда процесс отправляет SIGUSR1, вызывается обработчик и разблокируется select ().Изучив fdsets, вы узнаете, что это произошло не по какой-либо другой причине, кроме как сигнализация самой вашей программы.