没有read()清空或“刷新”文件描述符?
(注意:这不是如何刷新write()
。这是它的另一端 ,可以这么说。)
是否可以清空一个文件描述符,其中包含要读取的数据, 而不必read()
它? 您可能对数据不感兴趣,因此阅读它们会浪费您可能更好地使用的空间和周期。
如果在POSIX中不可能,那么任何操作系统都有任何不可移植的方法吗?
更新:请注意我正在谈论文件描述符 , 而不是流。
流有fclean可用,它刷新写缓冲区,并将读缓冲区返回给IO系统。
http://www.gnu.org/software/hello/manual/libc/Cleaning-Streams.html
如果您真正想要做的是跳过字节,重新定位文件指针是正确的操作。 只需跳过你不想读的字节数。
http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive
如果您正在处理tty ,请查看tcflush()
:
#include int tcflush(int fildes, int queue_selector);
成功完成后,tcflush()会丢弃写入fildes引用的对象的数据(与终端关联的打开文件描述符)但不传输,或接收但未读取的数据,具体取决于queue_selector的值[…]
对于POSIX,使用lseek(2)
或lseek64(3)
来提前寻找。 对于Windows,请使用SetFilePointer()
或SetFilePointerEx()
。
read()和flush()都不是标准C或C ++的一部分,但当然没有一个标准函数支持刷新输入流。 我猜这反映了底层操作系统中没有的东西。 避免完全阅读某些内容的常用方法是使用某种seek()函数跳过它。
如果你知道要跳过的字节数,你可以做lseek(fd, n, SEEK_CUR);
对于POSIX系统。 对于FILE *
对象,也有fseek()
。 在POSIX中,我认为你可以安全地寻找文件的末尾,我的想法是,如果以后写入更多数据,以便使数据超过使用lseek()
设置的位置,那么你现在可以读取更多数据。
据此,POSIX系统将在fflush(stream);
上执行此操作fflush(stream);
。
对于打开读取的流,如果文件尚未处于EOF,并且文件是能够搜索的文件,则应调整基础打开文件描述的文件偏移量,以便打开文件描述的下一个操作处理最后一个字节读取或写入正在刷新的流之后的字节。
具有GNU C库版本2.5或更高版本的Linux 2.6.17或更高版本包含splice()
系统调用,该调用可用于将数据从一个文件描述符发送到另一个文件描述符, 而无需将其复制到用户空间 。 这可以通过简单地打开/dev/null
并将数据从源文件描述符splice
到/dev/null
文件描述符中来丢弃数据。