monitora o tráfego do canal entre processos

9

Eu tenho dois processos Linux se comunicando por meio de um pipe sem nome. Como pode monitorar o tráfego no tubo? Como posso injetar dados no pipe? Eu tenho acesso root e conheço o inode do pipe.

    
por jackhab 14.12.2010 / 16:10

2 respostas

7

Um pipe sem nome é, por natureza, privado para os aplicativos que possuem o descritor de arquivo. Não há nenhuma maneira de observar ou modificar o tráfego no pipe. Eu não acho que há uma maneira de olhar para o pipe diretamente no Linux, também.

Existe uma maneira sem princípio de fazer mais ou menos o que você procura depois: através da chamada de sistema ptrace . Você não estaria alinhado no tubo, mas em um dos processos. Para observação, use strace , por exemplo

strace -p1234 -s99999 -e write

em que 1234 é o ID do processo de um processo que escreve no pipe. Modificar os dados é mais difícil, mas pode ser feito. Acho que a maneira mais fácil seria primeiro configurar um processo intermediário que copia sua entrada padrão para sua saída padrão, além dos dados que você deseja injetar (e menos os dados que deseja suprimir). Crie dois pipes nomeados e inicie esse processo intermediário com stdin em um canal e stdout no outro. Em seguida, use um depurador (por exemplo, GDB ) para que ambos os processos de destino executem open no canal nomeado apropriado e, em seguida, dup para colocar o pipe no descritor de arquivo apropriado. Note que há uma chance de você falhar em um dos processos no processo.

(Se você não entende o último parágrafo, me desculpe, mas isso requer um certo nível de tecnicidade. Eu não acho que haja uma maneira mais fácil.)

    
por 15.12.2010 / 01:11
2

Algumas ferramentas úteis para monitorar um canal:

Visualizador de caches
tee

Para um programa já em execução em que não se controla o encanamento, consulte o método gdb: Redirecionando a saída de um processo em execução .

Ou pode-se usar strace :

strace -ewrite -p $PID 2>&1 | grep "write(1"

mostra apenas as chamadas do descritor 1. "2 > & 1" é redirecionar stderr para stdout, como strace escreve para stderr por padrão.

    
por 14.12.2010 / 16:18