Я открываю другой процесс в своем приложении, используя popen
и анализируя его вывод. Я хочу получить уведомление, как только программа сделает какой-либо вывод. В настоящее время все вещи в моей программе используют epoll
для таких действий. Теперь popen
возвращает FILE *
вместо fd
. Сохраняется ли использование функции fileno
и поместите полученный результат fd
в epoll
? Если нет, есть ли другой способ? Я не хочу, чтобы процесс блокировался, поэтому я хочу получать уведомления.Используйте ФАЙЛ * в epoll
ответ
Да, это безопасно, если вы не делаете никаких дополнительных действий с файловым дескриптором, не будучи осторожным, это кажется безопасным. Еще одна вещь: вы, вероятно, хотите также отметить дескриптор файла как неблокирующий. Чтобы вы могли read()
без блокировки и управления EBUSY
или EAGAIN
проверка errno
.
Я согласен с вами в том, что использование 'epoll()' в файловом дескрипторе интерфейса 'FILE * 'безопасно - оно просто возвращает дескриптор как активный. Но * отметить дескриптор файла как неблокирующий *? Я не думаю, что гарантированно будет безопасно, если фактическое чтение выполняется с помощью функций stdio на основе 'FILE *', как указано в вопросе. Пометка «неактивного» дескриптора файлового дескриптора 'FILE *' может вызывать серьезные проблемы, поскольку библиотеки почти наверняка не предназначены для использования неблокирующего дескриптора. –
Я бы рекомендовал не смешивать буферный ввод-вывод ('FILE *') и (e) опрос. Лично я просто написал свой собственный «popen_fd», который возвращает дескриптор, с которого вы можете «читать». – melpomene