У меня есть два процесса, первое чтение из stdin и запись в файл FIFO, второй - сообщение из файла FIFO.Как остановить чтение fgets из файла FIFO
Я использую эту структуру программы:
while(run)
{
fgets(string, sizeof(string), fp);
}
и когда дозорный (бег) изменение в 0, чтобы остановить процесс, это на самом деле не остановить, потому что он застрял в fgets()
функции. Как я могу это решить?
Я хочу, чтобы программа ожидала сообщения, когда дозорный сигнал изменился на 0, а затем немедленно остановите программу.
Обычный способ сделать это - использовать 'select' для ожидания ввода перед вызовом' fgets'. Чтобы разразиться рано, очистите 'run', а затем отправьте сигнал процессу. Сигнал будет прерывать 'select', он вернется к началу цикла, посмотрите, что' run' очистился и, таким образом, выйдет. – kaylum
Можете ли вы рассказать, как это будет выглядеть в этом конкретном случае? –
Другой вариант - использовать обработчик сигнала для очистки 'run'. Если обработчик установлен без флага 'SA_RESTART', его доставка прервет любые блокирующие чтения/записи syscalls в том же потоке. Лично я использую низкоуровневые (unistd.h) операции ввода-вывода, неблокирования и select(). –