我想使用 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?)