종료하기 전에 EOF를 보내지 않는 프로세스가 있고 어떻게 생성하나요?

종료하기 전에 EOF를 보내지 않는 프로세스가 있고 어떻게 생성하나요?

SIGINT프로세스가 각각 사용되고 종료될 때 EOF를 보내지 않는 것 같습니다 SIGKILL. 이것이 사실일 수 있습니까(또는 모든 프로세스가 신호에 의해 종료된 후 항상 EOF를 전송합니까 stdout) stderr? 그렇다면 Java 단위 테스트에서 사용할 수 있도록 이러한 프로세스를 어떻게 모방할 수 있습니까(초보자의 경우 Linux에서만 실행하면 됨)?

영어위키피디아 EOF 기사이것에 대해 확실하지 않습니다.독일 사람EOF를 보내는 것이 "가능"함을 나타냅니다.

나는 이것이 아마도 XY 문제라는 것을 알고 있으며 Java 코드를 디버깅하는 동안 지원을 요청하면 문제를 더 빨리 해결할 수 있지만 이 질문에 대한 답변을 얻는 데에도 관심이 있습니다. Java 9에서 프로세스 처리 기능이 향상된 것으로 알고 있지만 아직 사용할 수는 없습니다.

저는 우분투 17.04와 리눅스 4.10을 사용하고 있습니다.

답변1

An은 EOF실제로 "전송"되지 않습니다. 이는 프로세스가 read시스템 호출을 호출하고 를 반환하는 이벤트입니다 0. 파이프의 경우 파이프의 다른 쪽 끝이 닫힐 때 발생합니다(파일 설명자가 복사된 경우 파이프를 소유한 모든 프로세스에 의해).

커널은 항상 종료됩니다.모두프로세스에서 파일 설명자를 종료합니다. 이 문제를 해결할 수 있는 방법이 없습니다(SIGKILL 프로세스의 파일 설명자도 닫힙니다). 이러한 파일 설명자 중 하나가 파이프 파일 설명자의 쓰기 끝에 대한 마지막 참조인 경우 read해당 읽기 끝의 다음 파일 설명자는 0을 반환하며 이는 stdio로 해석됩니다 EOF.

답변2

EOF몇 글자만 보내면 문제 없을 수도 있습니다. 따라서 EOFJava 프로그램이 종료된 후 출력되는 쉘 코드를 사용하여 Java 프로그램을 실행할 수 있습니다.

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

그러나 Java 프로세스가 종료되었지만 후속 코드가 계속 실행되도록 하려면 일부 신호 처리 구성이 필요합니다. 이것이 귀하에게 적합한 접근 방식이라면(다른 터미널에서 직접 Java 프로세스를 종료하여 이를 테스트할 수 있음 kill $PID) 필요한 경우 이를 수행하기 위한 추가 정보를 제공할 수 있습니다.

관련 정보