Saída para um arquivo usando o descritor de arquivo

4

Eu queria saber se é possível redirecionar a saída de um processo (no OS X / Linux) para outro processo se eu souber o fd de outro processo. Por exemplo:

Eu abro um arquivo usando o vim: vim /tmp/test . Isso abre um arquivo e quando eu uso lsof | grep test para descobrir o descritor de arquivo que recebo:

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

Diz-me que o FD é 4 e que está aberto para escrever e ler.

Existe uma maneira que eu possa agora redirecionar a saída de outro processo para esse descritor de arquivo (por exemplo, echo 'test' > & 4 - isso não funciona, mas você tem a idéia)?

    
por markovuksanovic 08.10.2014 / 07:35

1 resposta

4

Cada processo tem sua própria tabela FD (veja link ), caso contrário, o processo A teria que se comunicar com o processo B sobre os filedescriptors (e não apenas com B, mas também com todos os outros processos na máquina). Então, apenas sabendo que o FD (interno) não é suficiente, você precisa saber para onde este FD aponta:

$> 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

Como você pode ver, há algum FD aberto no irc-client que eu uso (irssi), stdin é lido do arquivo /dev/pts/1 . Dado que eu tenho as permissões para escrever para esse arquivo, sou capaz de canalizar coisas para esse arquivo:

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

E pelo menos algo vai acontecer. Assim, você pode redirecionar a saída de um programa para outro, embora isso possa levar a problemas estranhos.

    
por 08.10.2014 / 07:56