終了する前にEOFを送信しないプロセスがあり、どのように生成しますか?

終了する前にEOFを送信しないプロセスがあり、どのように生成しますか?

SIGINTプロセスがそれぞれ使用され、終了したときにEOFを送信しないようですSIGKILL。これは本当ですか(またはすべてのプロセスがシグナルによって終了した後は常にEOFを送信しますか?stdout) 。stderrそれでは、Javaユニットテストで使用できるようにこれらのプロセスをどのように模倣できますか(初心者の場合はLinuxでのみ実行できます)。

英語ウィキペディア EOF 記事これについてはわかりません。ドイツ人EOF を送信することが「可能」であることを示します。

私はこれがおそらくXYの問題であることを知っており、Javaコードのデバッグ中にサポートを求めることで問題をより早く解決できますが、この質問に対する回答を得ることにも興味があります。 Java 9では、プロセス処理機能が改善されていることがわかっていますが、まだ使用できません。

私はUbuntu 17.04とLinux 4.10を使用しています。

答え1

AnはEOF実際には「転送」されません。これは、プロセスがreadシステムコールを呼び出してを返すイベントです0。パイプの場合、パイプのもう一方の端が閉じられると発生します(ファイル記述子がコピーされた場合はパイプを所有するすべてのプロセスによって)。

カーネルは常に終了します。みんなプロセスでファイル記述子を終了します。この問題を解決する方法はありません(SIGKILLプロセスのファイル記述子も閉じます)。これらのファイル記述子の1つがパイプファイル記述子の書き込み終了への最後の参照である場合、その読み取り終了の次のreadファイル記述子は0を返しstdioますEOF

答え2

EOFほんの数文字を送っても問題ないかもしれません。したがって、EOFJavaプログラムの終了後に出力されるシェルコードを使用してJavaプログラムを実行できます。

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

ただし、Javaプロセスが終了しても後続のコードを実行し続けるには、いくつかの信号処理構成が必要です。これが適切なアプローチである場合(他の端末で直接Javaプロセスを終了してテストすることができますkill $PID)、必要に応じてこれを行うための追加情報を提供できます。

関連情報