Provavelmente não; reiniciar o consumidor de entrada padrão requer a capacidade desse consumidor de exec
em si.
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char buf[1];
int ret;
int linenumber = 0;
fprintf(stderr, "collect me some input...\n");
while (1) {
ret = read(STDIN_FILENO, buf, 1); // unbuffered. inefficient
if (ret == 0) // EOF
exit(EXIT_SUCCESS);
else if (ret < 0)
err(1, "read failed");
write(STDOUT_FILENO, buf, 1);
if (buf[0] == '\n') {
linenumber++;
if (linenumber == 4) { // restart ourself every four lines...
execvp(*argv, argv);
err(1, "exec failed");
}
}
}
exit(EXIT_SUCCESS);
}
Quando executado, reinicia a si mesmo a cada quatro linhas:
$ make execself
cc execself.c -o execself
$ perl -E 'say "line $_" for 1..8' | ./execself
collect me some input...
line 1
line 2
line 3
line 4
collect me some input...
line 5
line 6
line 7
line 8
collect me some input...
$
Eu vou sair em um membro e acho que um soquete ou fila de mensagens pode servir melhor a necessidade de matar aleatoriamente e reiniciar o consumidor de saída, como então as mensagens (até um limite de buffer ou com bloqueio ...) permanecerão enquanto o processo do consumidor está sendo eliminado e reiniciado. Ou você pode escrever um proxy de algum tipo que leia entrada padrão e seja tolerante de que o consumidor java subseqüente não esteja disponível aleatoriamente, ou seja capaz de reiniciar mais ou menos normalmente o dito consumidor.
(Note que com as leituras em buffer, o consumidor pode precisar tomar mais cuidado para processar ou de alguma forma transmitir os dados incompletos que foram lidos pela leitura em buffer, mas não foram tratados no momento da reinicialização ou da saída ...)