Вывод в файл с использованием файлового дескриптора
Мне было интересно, можно ли перенаправить вывод одного процесса (в OS X/ Linux) на другой процесс, если я знаю fd другого процесса. Например:
Я открываю файл с помощью 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-клиенте есть несколько открытых файлов (irssi), из файла читается stdin /dev/pts/1
, Учитывая, что у меня есть разрешения на запись в этот файл, я могу передать данные в этот файл:
$> echo "/names" >> /dev/pts/1
И, по крайней мере, что-то случится. Таким образом, вы можете перенаправить вывод одной программы в другую, хотя это может привести к странным проблемам.