Java 프로그램을 시작했는데 유닉스 터미널에서 무한 루프가 발생했습니다(터미널 창을 가정하면).TW1) 두 번째 터미널 창을 열었습니다(예:TW2) ps -ef | grep java
명령을 실행하면 다음과 같은 결과가 나타납니다.
501 32566 32444 0 2:26PM ttys000 7:43.89 /usr/bin/java com.test.Hello
501 32784 31676 0 2:34PM ttys003 0:00.00 grep java
1) 식별 ttys000
여부TW1그리고 ttys003
결정한다TW2?
2) 첫 번째 줄은 실행 중인 Java 프로세스를 나타냅니다. 와 연관되어 있습니다 ttys000
. 그래서 기본적으로TW1내 Java 프로세스의 제어 터미널입니다. 맞아?
3) 명령을 실행하면 ps -ef
열에 여러 프로세스가 표시됩니다. 이는 프로세스와 관련된 개방형 터미널이 없다는 것을 의미합니까???
tty
답변1
1.)
예, 더 많은 내용이 있지만요. ttys000
은(는) 에 있는 문자 장치이기도 합니다 /dev
. 쓰기 tty
그룹 권한이 있는 사용자(대부분의 사용자가 그렇습니다)는 문자를 장치에 파이프할 수 있으며 해당 터미널에 나타납니다. ttys*
실제 텔레타이퍼는 아니지만 tty
적절한 이름의 터미널 에뮬레이터로 에뮬레이션됩니다.
저는 Mac이 없으므로 다음 예에서는 Linux 명명 규칙을 사용하겠습니다.
사용자 A로 터미널 A를 열고 에뮬레이트된 tty를 찾습니다.
[userA@terminalA]$ tty
/dev/pts/0
사용자 B로 터미널 B를 열고 동일한 작업을 수행합니다.
[userB@terminalB]$ tty
/dev/pts/3
이제 터미널 A에서 터미널 B로 몇 개의 문자를 리디렉션합니다.
[userA@terminalA]$ echo Hi there > /dev/pts/3
터미널 B에 나타나는 것을 확인하세요.
[userB@terminalB]$ Hi there
나는 Mac에서 이러한 장치가 /dev/ttys*
.
2.)
다소간. 그 ttys000
자체는 단지 문자 장치일 뿐이며, Java 프로세스를 제어하는 실제 엔터티는 터미널 에뮬레이터입니다. 통과제어내 말은 그것이 Java 프로세스의 상위 프로세스라는 것을 의미합니다. 상위 프로세스는 다른 프로세스보다 하위 프로세스와 더 쉽게 상호 작용할 수 있습니다.
또한 특정 예방 조치를 취하지 않으면( man nohup
해당 예방 조치의 예 참조) 상위 프로세스가 종료되면 모든 하위 프로세스도 종료됩니다.
삼)
이것칼슨의 대답이미 설명했듯이 이는 ?
터미널 독립적인 프로세스를 의미합니다.
단말 자체는 단순한 캐릭터 장치이기 때문에 프로세스가 단말 장치와 연관될 필요는 없다고 결론짓는 것은 어렵지 않다고 생각합니다.
결론
실제 터미널은 /dev/tty
최신 *nix 운영 체제에서는 거의 사용되지 않습니다(부팅 프로세스 중에 널리 사용되지만). 하지만 이것이 실제 터미널을 사용할 수 없다는 의미는 아닙니다. Linux 컴퓨터에서(죄송합니다. Mac에서 어떻게 하는지 모르겠습니다) ++ Ctrl( 및 , , ...까지 )를 결합하면 다음과 같은 결과가 나옵니다.AltF1F2F3F7진짜단말기. 이러한 실제 터미널 중 하나는 그래픽 표시를 수행하는 데 사용됩니다.
그래픽 애플리케이션을 포함한 최신 *nix 운영 체제의 여러 프로세스는 이를 실행하는 스크립트가 추가 인수를 전달해야 하기 때문에 터미널 장치와 연결됩니다. 이 스크립트는 셸을 트리거하고 추가 매개변수를 전달하며 프로세스를 시작합니다. 이러한 스크립트는 종종 혼란을 야기합니다.