Se você olhar o link /proc/$PID/fd/0
, verá que ele aponta para o terminal:
# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15
Quando você envia para ele, você não está passando a entrada para o processo nc
, você está enviando para o terminal. Que imprime o que você produz.
Parece assim:
/proc/$PID/fd/$N <-------> [ ]
[ terminal ]
[ nc ] <--------------------> [ ]
Não assim:
/proc/$PID/fd/$N
| |
[ ] <-----+ +------> [ ]
[ nc ] <--------------------> [ terminal ]
Se o descritor de arquivo 0 do processo fosse aberto em um arquivo, você ainda esperaria uma gravação para /proc/$PID/fd/0
para mostrar como entrada para o processo, ou para ir para o arquivo aberto?
lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile
O que deve echo foo > /proc/11994/fd/0
fazer neste caso?
É o mesmo aqui. Quando o processo lê a partir do fd, ele lê os dados do arquivo. Mas quando você reabre o mesmo arquivo para escrever através de /proc/$PID/fd/$N
, você escreve para o arquivo.
Você precisará usar o ioctl TIOCSTI ou algum mecanismo semelhante para inserir dados no buffer de entrada do terminal. Veja tty_ioctl (4)