7

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

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

4

2 回答 2

8

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

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

于 2010-09-03T22:38:00.947 回答
2

作为替代方案,如果“fd 与管道、套接字或 FIFO 相关联” ,lseek()则会失败。ESPIPE所以一个无操作lseek(fd, 0, SEEK_CUR)会告诉你文件描述符是否是这些中的任何一个。

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

于 2015-02-27T21:23:34.127 回答