Imprime o número atual de bytes em um pipe

4

Eu posso criar um pipe para transferir informações entre dois programas. Eu posso até usar um utilitário como pv para ver o progresso do total de dados passando pelo canal. No meu caso, estou usando um pipe nomeado. Quando os dados são gravados no pipe, eles permanecem lá até que algum outro programa os leia.

É possível imprimir o número atual de bytes no pipe sem realmente lê-los?

Atualização:

Encontrou estes artigos úteis:

link

link

    
por dtmland 14.12.2016 / 17:45

1 resposta

5

Observe que quando você faz:

cmd > named-pipe

Embora não haja outro processo que tenha o canal aberto para leitura, é o open() que trava. Esse open() acima é feito pelo shell, cmd nem sequer é iniciado, então não terá enviado nenhum dado para ele.

Em vários sistemas como Solaris, AIX ou HP / UX, mas não no Linux, o número de bytes no canal, se instanciado, seria mostrado no campo de tamanho de ls -l no canal.

Em alguns sistemas (incluindo Linux, veja pipe (7) ), você pode obter o número de bytes em um pipe (chamado ou não) com o FIONREAD ioctl() . No entanto, isso deve ser executado em um descritor de arquivo no pipe (para qualquer extremidade), o que significa que, para um pipe nomeado, é necessário abri-lo, o que significa que você pode acabar instanciando o pipe como um efeito colateral (e kill ao fechar).

perl -le 'require "sys/ioctl.ph";
          ioctl(STDIN, &FIONREAD, $n) or die$!;
          print unpack "L", $n' <> named-pipe
    
por 14.12.2016 / 18:07

Tags