以非阻塞方式读取文本行

3
在一个C程序中,我想从stdin读取文本行。同时,我希望处理来自另一个文件描述符的数据。
我尝试使用poll来等待任何一个源变为可读,并相应地处理它们。然而,poll需要裸文件描述符,而对于像fgets这样读取整行的操作,我需要一个FILE句柄。
我可以使用fileno或fdopen来“转换”它们,但混合使用两者似乎不是一个好主意。
因此,有没有一种好的方法可以等待文本行而不阻塞或线程化?

为什么不使用诸如read()之类的系统调用从标准输入读取数据? - MikeCAT
read 函数不能轻易地读取到行末。这意味着我需要实现自己的缓冲基础设施,类似于 FILE - michas
fdopen 看起来对我来说是正确的。你试过了吗? - Jabberwocky
请注意,当poll()因为stdin有更多数据而返回时,并不意味着整行数据已经到达,因此fgets()仍然可能会阻塞。 - Sergio
你应该使用自己的 fgets() 函数,如果在 stdin 上没有完整的行,则返回类似于 EAGAIN 的内容。 - Sergio
@Serhio,那可能是最好的解决方案。请写一个答案让我接受它。 - michas
1个回答

0

您可以使用任何多路复用方式(如 select()poll()epoll_wait())。但是,您不应该使用 fgets()stdin 中读取数据,因为多路复用无从知道我们是否完整地读取了一行数据。在某些情况下,这可能会导致阻塞。您应该编写自定义的读取函数,以指示尚未完整读取一行并立即返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接