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