进程替换中使用了哪些文件描述符(/dev/fd/##)?

进程替换中使用了哪些文件描述符(/dev/fd/##)?

我有一个需要两个输入的程序:

my_program --input1 {videoFile1} --input2 {videoFile2}

我想通过进程替换重定向我的输入(因为我的输入是大型视频文件,我想即时转码)。通过实验,我使用以下功能,功能很好:

my_program --input1 /dev/fd/63 --input2 /dev/fd/62 <( {video transcoding command 1} ) <( {video transcoding command 2} )

我的问题是:为什么文件描述符编号是 63 和 62?它们是否始终保证采用这些值,还是这取决于系统?

如果有详细记录的话我很抱歉,但是到目前为止我在搜索中找不到它。

谢谢你的时间!

答案1

视频处理以查找文件而闻名。这意味着您不能使用流作为输入。如果您使用另一个程序的输出,那么它是一个流 - 无论您使用管道还是 fds。

但也许你很幸运你的程序可以使用管道。在这种情况下,这应该没问题:

my_program --input1 <( {video transcoding command 1} ) --input2 <( {video transcoding command 2} )

<() 看起来就像 < 一样在 stdin 上给你提供了一些东西。但事实并非如此。相反,它被替换为管道的链接:

$ echo <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true) <(true)
/dev/fd/63 /dev/fd/62 /dev/fd/61 /dev/fd/60 /dev/fd/59 /dev/fd/58 /dev/fd/57 /dev/fd/56 /dev/fd/55 /dev/fd/54 /dev/fd/53 /dev/fd/52 /dev/fd/51 /dev/fd/50 /dev/fd/49 /dev/fd/48 /dev/fd/47 /dev/fd/46 /dev/fd/45 /dev/fd/44 /dev/fd/43 /dev/fd/42 /dev/fd/41 /dev/fd/40 /dev/fd/39 /dev/fd/38 /dev/fd/37 /dev/fd/36 /dev/fd/35 /dev/fd/34 /dev/fd/33 /dev/fd/32 /dev/fd/31 /dev/fd/30 /dev/fd/29 /dev/fd/28 /dev/fd/27 /dev/fd/26 /dev/fd/25 /dev/fd/24 /dev/fd/23 /dev/fd/22 /dev/fd/21 /dev/fd/20 /dev/fd/19 /dev/fd/18 /dev/fd/17 /dev/fd/16 /dev/fd/15 /dev/fd/14 /dev/fd/13 /dev/fd/12 /dev/fd/11 /dev/fd/10 /dev/fd/9 /dev/fd/8 /dev/fd/7 /dev/fd/6 /dev/fd/5 /dev/fd/3 /dev/fd/4 /dev/fd/64 /dev/fd/65 /dev/fd/66 /dev/fd/67
$ ls -l <(true)
lr-x------ 1 tange tange 64 Nov 12 07:59 /dev/fd/63 -> pipe:[1200523]

因此,你可能会遇到以下这样的情况:

$ cmd 2> >(cmd2) | cmd3

相关内容