我可以确定与文件关联的stdio用户空间读取缓冲区中有多少个字节吗?

时间:2018-10-11 01:16:15

标签: c linux stdio buffering

我正在编写一个C程序,该程序通过TCP套接字连接到另一台计算机,并通过该TCP连接读取换行符分隔的文本。

我使用poll检查与套接字关联的文件描述符上的数据是否可用,然后将字符读入缓冲区,直到获得换行符。但是,为了使逐个字符高效读取,我使用的是stdio FILE,而不是使用read系统调用。

当短短的多行输入快速通过套接字时,我当前的方法存在一个错误。当我开始阅读字符时,stdio将在用户空间中缓冲几行数据。读完一行并对其进行处理后,我再次poll套接字文件描述符来确定是否还有更多数据要读取。

不幸的是,poll(和fstat,以及我知道的用于获取文件中字节数的所有其他方法)都不知道在用户空间中作为一部分缓存的剩余数据FILE中的一个。这导致我的程序在应该使用已缓冲到用户空间中的数据时在该poll上阻塞。

如何检查用户空间中缓冲了多少数据?规范明确告诉您不要为此而依赖setvbuf(表示格式未定义),所以我希望有另一个选择。

现在,看来我最好的选择是在我可以控制的地方实现自己的用户空间缓冲,但是我想在走这条路之前进行检查。

编辑: 通过将文件设置为非阻塞并尝试fgetc / fungetc一个字符,某些注释确实提供了一种测试是否至少有一个字符的方法,但这无法告诉您有多少个字符字节可用。

0 个答案:

没有答案