代码之家  ›  专栏  ›  技术社区  ›  Teddy

空的或“刷新”没有read()的文件描述符?

  •  10
  • Teddy  · 技术社区  · 15 年前

    (注:这是 如何冲洗 write() . 这就是 另一端 可以这么说。)

    是否可以清空包含要读取数据的文件描述符 没有 不得不 read() 是吗?您可能对数据不感兴趣,因此读取所有数据会浪费您可能更好地使用的空间和周期。

    如果在POSIX中是不可能的,那么是否有任何操作系统有任何不可移植的方法来实现这一点?

    更新: 请注意我说的是 文件描述符 ,请 溪流。

    7 回复  |  直到 9 年前
        1
  •  2
  •   jdmichal    15 年前

    流具有可用的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

        2
  •  7
  •   squelart    15 年前

    如果你正在处理一个 TTY ,看一下 tcflush() 以下内容:

    #include <termios.h>
    int tcflush(int fildes, int queue_selector);
    

    成功完成后,tcflush()。 丢弃写入对象的数据 由fildes(打开的文件)引用 与终端关联的描述符) 但未传输或接收到的数据 但不读取,取决于值 队列选择器[…]

    http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html

        3
  •  2
  •   Adam Rosenfield    15 年前

    对于POSIX,使用 lseek(2) lseek64(3) 向前看。对于Windows,使用 SetFilePointer() SetFilePointerEx() .

        4
  •  1
  •   anon    15 年前

    Read()和FulHuSE()都不是标准C或C++的一部分,但肯定没有一个标准函数支持输入流的刷新。我想这反映了底层操作系统中不可用的东西。避免完全读取某些内容的正常方法是使用某种seek()函数跳过它。

        5
  •  1
  •   Alok Singhal    15 年前

    如果知道要跳过的字节数,可以 lseek(fd, n, SEEK_CUR); 对于POSIX系统。有 fseek() 同样,为了 FILE * 物体。在POSIX中,我认为您可以安全地越过文件的末尾进行搜索,其思想是,如果以后写入更多的数据,以便使数据越过 lseek() ,您现在可以读取更多数据。

        6
  •  0
  •   Chinmay Kanchi    15 年前

    根据 this ,POSIX系统将在 fflush(stream); .

    对于打开供读取的流,如果该文件尚未在EOF,并且该文件能够查找,则应调整基础打开文件描述的文件偏移量,以便对打开文件描述的下一个操作处理最后一个从正在刷新的流读取或写入的流之后的字节。

        7
  •  0
  •   Teddy    9 年前

    带有GNU C库版本2.5或更高版本的Linux 2.6.17或更高版本包含 splice() 系统调用,可用于将数据从一个文件描述符发送到另一个文件描述符 不复制到用户空间 . 这可以通过简单地打开来丢弃数据 /dev/null splice 将源文件描述符中的数据 /DEV/NULL 文件描述符。