C 在epoll中使用文件*

C 在epoll中使用文件*,c,popen,file-descriptor,C,Popen,File Descriptor,我正在应用程序中使用popen打开另一个进程,并解析其输出。我想在程序完成任何输出后尽快得到通知。目前,我的程序中的所有内容都使用epoll执行此类操作。现在popen确实返回了一个文件*,而不是fd。使用fileno功能并将生成的fd放入epoll是否保存?如果没有,还有别的办法吗?我不希望进程被阻止,这就是我想要通知的原因。是的,它是安全的,只要你不在不小心的情况下对文件描述符做任何额外的事情,它看起来是安全的。还有一件事,您可能也希望将文件描述符标记为非阻塞。这样您就可以read()而无需

我正在应用程序中使用
popen
打开另一个进程,并解析其输出。我想在程序完成任何输出后尽快得到通知。目前,我的程序中的所有内容都使用
epoll
执行此类操作。现在
popen
确实返回了一个
文件*
,而不是
fd
。使用
fileno
功能并将生成的
fd
放入
epoll
是否保存?如果没有,还有别的办法吗?我不希望进程被阻止,这就是我想要通知的原因。

是的,它是安全的,只要你不在不小心的情况下对文件描述符做任何额外的事情,它看起来是安全的。还有一件事,您可能也希望将文件描述符标记为非阻塞。这样您就可以
read()
而无需阻塞和处理
EBUSY
EAGAIN
检查
errno

我建议不要混合使用缓冲I/O(
文件*
)和(e)轮询。就我个人而言,我只需编写自己的
popen\u fd
,返回一个可以
读取的描述符。我同意您的观点,在
文件*
接口的文件描述符上使用
epoll()
是安全的-它只需返回处于活动状态的描述符即可。但是,是否将文件描述符标记为非阻塞?我认为,如果实际读取是通过问题中提到的基于
文件*
的stdio函数完成的,那么就不能保证安全。将
文件*
的底层文件描述符标记为非阻塞可能会导致严重的问题,因为库调用几乎肯定不是为使用非阻塞描述符而设计的。