代码之家  ›  专栏  ›  技术社区  ›  Daniel Trebbien

确定可读文件描述符是否为管道的读取端

  •  7
  • Daniel Trebbien  · 技术社区  · 14 年前

    我想用 splice 从零复制数据 STDIN_FILENO 到文件描述符(可以是常规文件、字符或块设备、FIFO或任何可以用 open )为了使用 剪接 ,要么 文件描述符或 文件描述符必须是管道的适当末端,因此通常在程序员希望将数据从非管道零复制到非管道时,会创建一个管道作为中间缓冲区。然而,如果 施蒂纳菲里诺 已经是管道的读取端,那么我可以跳过该步骤并尝试直接从 施蒂纳菲里诺 到另一个文件描述符。因此,我想能够确定 施蒂纳菲里诺 是管道的读取端。

    是否有Linux系统调用可以确定 施蒂纳菲里诺 是管道的读取端吗?

    2 回复  |  直到 9 年前
        1
  •  7
  •   Uli Schlachter    14 年前

    要获取有关打开的FD的信息,可以使用fstat()。我想结果的st_模式应该是管道的s_ifo。或者,/proc/self/fd/和/proc/self/fdinfo/也提供了一些关于文件描述符的信息。请记住/proc是特定于Linux的。

    不过,我认为,如果先尝试使用splice()失败(使用eival?),可能会更容易一些。回到你的魔法上来。

        2
  •  1
  •   Jonathon Reinhart    9 年前

    作为替代方案, lseek() 将失败 ESPIPE 如果“fd与管道、插座或FIFO相关联”,则为“no op”。 lseek(fd, 0, SEEK_CUR) 将告诉您文件描述符是否是其中之一。

    在我的情况下,这涵盖了我感兴趣的所有案件。