我正在编写一个C程序,该程序通过TCP套接字连接到另一台计算机,并通过该TCP连接读取换行符分隔的文本。
我使用poll
检查与套接字关联的文件描述符上的数据是否可用,然后将字符读入缓冲区,直到获得换行符。但是,为了使逐个字符高效读取,我使用的是stdio FILE
,而不是使用read系统调用。
当短短的多行输入快速通过套接字时,我当前的方法存在一个错误。当我开始阅读字符时,stdio
将在用户空间中缓冲几行数据。读完一行并对其进行处理后,我再次poll
套接字文件描述符来确定是否还有更多数据要读取。
不幸的是,poll
(和fstat
,以及我知道的用于获取文件中字节数的所有其他方法)都不知道在用户空间中作为一部分缓存的剩余数据FILE
中的一个。这导致我的程序在应该使用已缓冲到用户空间中的数据时在该poll
上阻塞。
如何检查用户空间中缓冲了多少数据?规范明确告诉您不要为此而依赖setvbuf
(表示格式未定义),所以我希望有另一个选择。
现在,看来我最好的选择是在我可以控制的地方实现自己的用户空间缓冲,但是我想在走这条路之前进行检查。
编辑:
通过将文件设置为非阻塞并尝试fgetc
/ fungetc
一个字符,某些注释确实提供了一种测试是否至少有一个字符的方法,但这无法告诉您有多少个字符字节可用。