Existe um processo que não envia EOF antes de terminar e como criá-lo?

1

Suspeito que um processo não envie EOF quando é eliminado com SIGINT e SIGKILL , respectivamente. Pode ser esse o caso (ou todos os processos sempre enviam EOF para stdout e stderr depois de serem finalizados com qualquer sinal)? Se sim, como posso imitar tal processo para que eu possa usá-lo em um teste de unidade Java (que precisa ser executado no Linux apenas para iniciantes)?

O artigo EOF da Wikipédia em inglês não é claro sobre isso, o alemão diz que EOF" pode "ser enviado.

Estou ciente do fato de que este é provavelmente um problema XY e pedir suporte na depuração do código Java obteria as correções mais rapidamente, mas estou interessado em obter uma resposta para essa pergunta também. Também estou ciente de que o processamento de processos foi aprimorado no Java 9, que ainda não posso usar.

Estou usando o Ubuntu 17.04 com o Linux 4.10.

    
por Karl Richter 19.08.2017 / 22:26

2 respostas

4

Um EOF não é realmente "enviado". É um evento em que seu processo chama a chamada de sistema read e retorna 0 , que para pipes ocorre quando a outra extremidade do canal foi fechada (por todos os processos que a possuem, se o filedescriptor foi duplicado).

O kernel sempre fechará todos filedescriptors nos processos de término. Não há maneira de contornar (até mesmo os textos dos processos do SIGKILL são fechados). Se algum desses filodescriptors for uma última referência a um fim de gravação de filedescriptor de pipe, o próximo read na extremidade de leitura correspondente retornará 0, que stdio interpretará como EOF .

    
por 19.08.2017 / 23:01
-1

Provavelmente não é um problema se vários caracteres EOF forem enviados. Assim, você pode executar seu programa Java junto com o código shell que gera EOF após a saída do programa Java.

( javaprog ; echo -n $'' ) | program_waiting_for_eof

Algumas configurações para o tratamento de sinal são necessárias, no entanto, para garantir que o processo Java seja eliminado, mas o código de acompanhamento ainda seja executado. Se esta é uma abordagem adequada para você (o que você pode testar matando o processo Java diretamente com kill $PID de outro terminal), então eu posso fornecer informações adicionais para fazer isso se você precisar.

    
por 19.08.2017 / 22:48