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

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

最佳答案

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

但是,我认为首先尝试使用 splice() 可能更容易,如果失败(使用 EINVAL?)

10-07 19:31
查看更多