Raw read
não será bloqueado se o pipe não estiver vazio - ele retornará, no entanto, muitos bytes estarão disponíveis no pipe, mesmo que você peça mais.
Você pode fazer uso disso e executar hexdump -C
em cada retorno bem-sucedido de read
.
#define _BSD_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#define N (8*512) //pipe size on my system as shown in 'ulimit -a'
static char buf[N];
int main(){
ssize_t nread;
FILE* p;
for(;;){
do { nread = read(0, buf, N); }while (nread < 0 && errno == EINTR);
if(nread == 0) return 0; //EOF
if(nread < 0) goto error;
p = popen("hexdump -C", "w"); if(!p) goto error;
if(fwrite(buf, sizeof(char), nread, p) != nread) goto error;
pclose(p);
}
return 0;
error:
perror(""); return 1;
}
Você pode salvar isso, por exemplo, como shovel.c
e, em seguida, make shovel
(ou gcc shovel.c -o shovel
) e usá-lo no seu canal.
Ou, se você não estiver interessado nisso, aqui está um snippet de ruby que deve fazer a mesma coisa:
tail -f file |
ruby -e 'PSIZE=8*512;
while(bytes = STDIN.readpartial(PSIZE));
IO.popen("hexdump -C","w") {|p| p.syswrite(bytes) }
end '