【问题标题】:How to determine if a file descriptor is seekable?如何确定文件描述符是否可搜索?
【发布时间】:2010-07-13 15:36:49
【问题描述】:

是否有任何可移植的方式(在 POSIX 系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR); 并检查返回值是否为-1,但我不确定这是否会产生误报或误报。使用fstat 并假设哪些类型的文件是可搜索/不可搜索的,这听起来不是一个好主意。还有其他想法吗?

【问题讨论】:

    标签: c posix file-descriptor


    【解决方案1】:

    lseek 方法似乎是合理的。它当然不会导致误报——如果确实如此,那么实施就会出现严重错误。此外,根据POSIX spec,如果描述符是管道、FIFO 或套接字,它应该会失败,所以理论上你也不应该有误报。剩下的唯一问题是不同系统在多大程度上符合规范。但是,似乎任何其他方法,无论它们是什么,都肯定比这更不便携。

    【解决方案2】:

    您可以使用 fstat(),然后使用 stat 结构的 mode 字段上的 S_ISREG 宏来检查它是否是常规文件;常规文件per definiton 是可搜索的,而“非常规”(特殊)文件可能不是(我不知道是否有特殊文件也可搜索)。

    但是,检查 lseek() 和 errno == ESPIPE 的返回值也应该可以工作。原则上是the effect of lseek() on devices which are incapable of seeking is implementation-defined,所以要小心鼻部守护进程。

    【讨论】:

    • 硬盘驱动器等块设备可以是可查找的。甚至可能是字符设备,但我不确定。
    • 一些不是真正可搜索的设备不会失败搜索(至少在 Linux 上,有人试图使搜索失败,但发现了依赖于行为的用户空间应用程序......)
    • 真;一些字符设备驱动程序会简单地忽略 seek() 并静默返回。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2013-11-22
    • 2014-04-10
    • 2012-03-27
    • 2010-10-27
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多