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

时间:2010-09-03 20:44:13

标签: c linux file-descriptor splice zero-copy

我想使用splice将数据从STDIN_FILENO归零到文件描述符(可以是常规文件,字符或块设备,FIFO或任何可以打开的内容)与open)。要使用splice文件描述符或文件描述符必须是管道的适当末端,因此通常会创建一个管道来提供服务当程序员想要将数据从非管道零拷贝到非管道时,作为中间缓冲区。但是,如果STDIN_FILENO已经是管道的读取端,那么我可以跳过该步骤并尝试直接从STDIN_FILENO拼接到另一个文件描述符。因此,我希望能够确定STDIN_FILENO是否是管道的读取端。

是否有Linux系统调用可以确定STDIN_FILENO是否是管道的读取端?

2 个答案:

答案 0 :(得分:7)

要获取有关open fd的信息,可以使用fstat()。我猜测结果的st_mode应该是管道的S_IFIFO。或者,/ proc / self / fd /和/ proc / self / fdinfo /还提供有关文件描述符的一些信息。请记住,/ proc是特定于Linux的。

但是,我认为首先尝试使用splice()并且如果失败(使用EINVAL?)可能会更容易回到你的魔法。

答案 1 :(得分:1)

作为替代方案,如果“fd与管道,套接字或FIFO相关联”,lseek()将失败并显示ESPIPE。因此,无操作lseek(fd, 0, SEEK_CUR)将告诉您文件描述符是否是其中任何一个。

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