일부 프로세스가 시작된 가상 터미널을 닫으면 출력이 바로 가거나 /dev/null
메모리를 어떻게 오염시킬 수 있습니까?
어쨌든 출력을 계속 읽을 수 있습니까?
[편집] : 프로세스를 실제로 폐기하는 순간이 출력을 제어 할 수있는 나의 힘의 끝입니까?
또한 중지 된 프로세스를 제거하면 처음에는 모든 것이 정상인 것처럼 보입니다. 작업이 종료되거나 표시되지 않습니다. 그러나 로그 아웃하면 ( 예를 들어 터미널을 닫는 것을 의미 하지 않고su
예를 들어 종료하십시오) 프로세스가 종료됩니다. 모두 동일하게 백그라운드에서 실행되지 않는 프로세스가 계속 실행될 수 있습니다.
답변
프로세스가 “삭제”되었다는 사실은이 프로세스를 생성 한 대화식 쉘에만 의미가 있습니다. 쉘이 작업 테이블에 프로세스를 더 이상 포함하지 않으며 쉘이 종료 될 때 SIGHUP이이 프로세스로 전송되지 않음을 의미합니다. 실제로 귀하의 질문과 관련이 없습니다.
삭제 된 가상 터미널로 전송되는 출력에 대한 정보 : 테스트를 직접 수행 한 결과 /dev/pts/x
장치에 액세스 할 수 없으며 장치를 가리키는 모든 파일 설명자가 닫힐 때까지 다시 할당되지 않습니다. 따라서 삭제 된 터미널에 쓰는 내용이 저장되는 이유를 알 수 없습니다. POSIX에 의해 정의되지 않은 것 같습니다.
터미널에 쓰는 일부 프로세스의 출력을 잡는 것에 대해서는 터미널이 여전히 살아있을 때조차 가능하지 않다 ¹. 터미널에 직접 입력을 가져 오기만하면됩니다 (예 : 키 입력 또는 pty의 마스터 부분에 의한 시뮬레이션 키 입력). 프로세스가 터미널에 쓰여진 내용을 stdin에서 읽으면 대부분의 프로세스에서 자체 io 루프가 발생합니다.
프로세스 종료에 대한 마지막 설명에 대해, 나는 실제로 무슨 일이 일어나고 있는지 모르겠지만 세션이있을 때 프로세스 그룹의 전경 / 백그라운드 상태와 관련된 신호 (SIGTTOU, SIGTTIN, SIGHUP 또는 기타)와 관련하여 다소 이상한 행동을 의심합니다. 리더 종료 (예 : su
언급 한 경우).
편집 에 대한 답변 : 아니오, 출력과 관련하여 프로세스가 제거 될 때 아무런 변화가 없습니다 : 이미 데몬처럼 분리되지 않는 한 여전히 제어 터미널에 연결됩니다. 를 사용하여 볼 수 있습니다 ps
. 그러나이 프로세스에서는 더 이상 셸에서 제공 한 fg
/ bg
/ jobs
명령 을 사용할 수 없습니다 . 즉, 터미널에서 입력을 공급하기가 어려울 수 있습니다 (포 그라운드 프로세스 그룹에 있어야 함).
—
1. 프로세스가 디버깅 도구에 기꺼이 걸리거나 납치되지 않는 한 (위의 주석 참조).
답변
이 특정 질문을 해결하기 위해 :
일부 프로세스가 시작된 가상 터미널을 닫으면 출력이 바로 / dev / null로 이동합니까, 아니면 어떻게 든 메모리를 오염시킬 수 있습니까?
터미널과 터미널에 연결된 프로그램은 파일처럼 읽고 쓰는 방식으로 tty 장치를 통해 통신합니다. 구체적으로, 가상 터미널은 “의사 -tty”(약칭 “pty”)를 생성 한 다음 쉘 (또는 다른) 프로세스를 생성하고 해당 프로세스의 stdin / out / err을 pty에 연결합니다. (자세한 내용은 운영 체제에 따라 다릅니다.)
가상 터미널을 닫으면 가상 터미널은 연결 끝 (pty “master”)을 닫습니다. 그 후, 연결의 다른 쪽 끝에있는 프로그램이 tty에 쓰면 오류가 리턴되고 데이터는 어디로 가지 않습니다. 마찬가지로 tty에서 읽은 경우 EOF (파일 끝) 표시기가 다시 나타납니다.
답변
질문의 가장 흥미로운 부분에 답하려면 라이브 실행 프로그램의 출력을 변경하려면 파일 설명자를 편집해야합니다. gdb를 사용하면 매우 쉽습니다. 그것은 해킹이지만 작동합니다.
만나다:
/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line
도우미 스크립트는 http://users.linpro.no/ingvar/fdswap.sh.txt 에 있습니다 .