使用文件描述符输出到文件

使用文件描述符输出到文件

我想知道如果我知道另一个进程的 fd,是否可以将一个进程(在 OS X/Linux 中)的输出重定向到另一个进程。例如:

我使用 vim 打开一个文件:vim /tmp/test。这将打开一个文件,当我使用它lsof | grep test来找出文件描述符时,我得到了:

vim    18689 user    4u     REG     1,2     12288 2675530 /private/tmp/.test.swp

它告诉我 FD 是 4,并且它可以进行写入和读取。

有没有办法现在将另一个进程的输出重定向到该文件描述符(例如,echo'test'>&4 - 这不起作用,但你明白了)?

答案1

每个进程都有自己的 FD 表(参见http://en.wikipedia.org/wiki/File_descriptor),否则进程 A 必须与进程 B 就文件描述符进行通信(不仅要与 B 进行通信,还要与机器上的所有其他进程进行通信)。因此,仅知道(内部)FD 是不够的,您需要知道此 FD 指向的位置:

$> ls /proc/2964/fd
total 0
lrwx------ 1 user group 64 Okt  6 15:09 0 -> /dev/pts/1
lrwx------ 1 user group 64 Okt  6 15:09 1 -> /dev/pts/1
lrwx------ 1 user group 64 Okt  6 15:09 2 -> /dev/pts/1
lrwx------ 1 user group 64 Okt  6 15:09 3 -> [eventfd]
lrwx------ 1 user group 64 Okt  6 15:09 4 -> socket:[1116342098]
l-wx------ 1 user group 64 Okt  6 15:09 5 -> /home/user/.irssi/logs/freenode/#channel.2014-10.log
lrwx------ 1 user group 64 Okt  6 15:09 6 -> [eventfd]
l-wx------ 1 user group 64 Okt  7 19:09 9 -> /home/user/.irssi/away.log

如你所见,我使用的 irc-client (irssi) 中打开了一些 FD,stdin 从文件中读取/dev/pts/1。鉴于我具有写入该文件的权限,我能够将内容传输到该文件中:

$> echo "/names" >> /dev/pts/1

至少会发生一些事情。因此,您可以将一个程序的输出重定向到另一个程序,尽管这可能会导致奇怪的问题。

相关内容