내가 아는 한, 쉘과 그 하위 프로세스는 동일한 (제어) 터미널을 사용하여 동일한 세션에 있습니다. 동일한 터미널이 연결되어 있기 때문에 대화형 프로세스라는 것을 읽었습니다. 지금은 실제 상호 작용이 사용자와 셸 사이에 있기 때문에 옳지 않다고 느껴지더라도 괜찮습니다.
GUI 프로그램(예: 브라우저, 텍스트 편집기), 창 관리자 및 데스크탑 환경은 어떻습니까? X11의 하위 프로세스입니까?
수정: 셸의 각 명령 파이프에는 서로 다른 PGID가 있습니다. 따라서 셸의 하위 프로세스에는 셸의 하위 프로세스와 동일한 PGID가 없습니다.
답변1
전통적인 유닉스 개념회의텍스트 터미널의 로그인 세션에 적합합니다.
X11 세션에서(예:회의특정 Unix 의미가 아닌 일반적인 의미에서 모든 프로세스는 일반적으로 세션 리더 프로세스의 자손입니다. 이는 세션 관리자(있는 경우), 창 관리자 또는 실행기(그래픽 셸)(있는 경우)일 수 있습니다. X11 세션을 시작하고 종료되는 프로세스가 있는데, 그 역할은 데스크탑 환경에 따라 다릅니다.
pstree
(기본 설치의 일부가 아닐 수 있음) 또는 ps axf
(Linux에만 해당)을 사용하여 프로세스 트리를 관찰할 수 있습니다. X 서버는 다른 프로그램과 동일한 트리 분기에 속하지 않습니다. 그 역할은 입력과 출력을 조정하는 것뿐이며 프로그램 시작에는 전혀 참여하지 않습니다. 일반적으로 a xinit
또는 a가 표시됩니다.디스플레이 관리자두 개의 하위 항목이 있는데, 하나는 X 서버이고 다른 하나는 X 세션 리더입니다.
일부 GUI 프로그램은 상위 프로세스가 종료된 경우(예를 들어 래퍼 스크립트에 의해 백그라운드에서 시작된 후 종료되었기 때문에) 프로세스 트리에 연결되지 않을 수 있습니다.
실제 상호작용은 사용자와 쉘 사이에서 이루어집니다.
실제로 쉘과 상호작용하는 경우에만 가능합니다. 터미널에서 실행 중인 다른 프로그램과 상호 작용할 때 관련된 셸은 없습니다. 입력과 출력은 프로그램과 터미널 사이에서 직접 이동하며, 쉘은 프로그램이 종료되거나 중단될 때까지 백그라운드에서 대기합니다.
답변2
편집: 처음에는 질문을 잘못 읽었습니다.
X windows는 디스플레이 서버입니다. 클라이언트 애플리케이션은 메시지를 사용하여 서버와 통신합니다. 이러한 프로세스에는 모든 입력이 X에서 오기 때문에 일반적으로 연결된 터미널이 없습니다. 애플리케이션에 터미널이 필요한 경우 의사 터미널이 생성되어 애플리케이션과 연결됩니다. 예를 들어 gnome-shell은 pty를 생성하고 bash와 연결합니다.
원본: 셸(작업 제어가 활성화된 상태)은 자신이 생성하는 각 하위 프로세스에 대한 프로세스 그룹을 생성합니다. x 응용 프로그램은 x11과 통신합니다. 즉, x11에 의해 실행되지 않습니다.
답변3
모든 일반 프로세스(GUI 프로세스 포함)는 자신을 세션 리더로 선언할 수 있습니다(예: os.setpgrp()
원래 대화 그룹이 아닌 를 통해(물론 회의 호스트가 되는 프로세스 제외). 새 세션 그룹의 pgid는 일반적으로(또는 항상 100% 확실하지는 않음) 자신을 세션 리더라고 부르는 프로세스의 pid입니다.
실제적인 예는 다음과 같습니다.
$ ps -eo pid,ppid,pgid,tty,cmd | egrep "(PPID|konsole|Running)"
PID PPID PGID TT CMD
4841 9633 4840 pts/3 grep -E (PPID|konsole|Running)
7375 1 7374 pts/3 konsole -p name=ROOT -e su -
9373 1 9373 ? kdeinit4: kdeinit4 Running...
9489 1 9373 ? kdeinit4: konsole [kdeinit] -session 102172181df177000142160830700000083410009_14428560
9492 1 9373 ? kdeinit4: konsole [kdeinit] -session 102172181df177000142901958900000018140011_14428560
9558 1 9373 ? kdeinit4: konsole [kdeinit] -session 102112051ed1c6000144239124800000016680010_14428560
나열된 프로세스의 대부분은 konsole
KDE 자체(pid 9373)에 의해 시작되고 kdeinit
해당 pgid 9373을 상속합니다.
그러나 konsole
pid 7375(동일한 모니터에 표시되고 다른 GUI 응용 프로그램과 마찬가지로 KDE에 의해 제어됨)는 konsole
다른 프로세스 중 하나에서 실행되는 쉘에서 수동으로 시작됩니다. 이는 pgid 7374에 속하며 konsole
프로세스 자체가 포크되었을 때 시작되었습니다(더 이상 존재하지 않으며 당시 세션 리더가 된 상위 pid 7374에 의해).
제어 터미널과 독립적입니다(예: 이러한 konsole 프로세스 내의 각 쉘에는 자체 tty가 있지만 수동으로 시작된 konsole 프로세스에만 pty/3이 있으며 조상 쉘에서 상속되고 KDE에서 시작된 프로세스에는 konsole
tty가 없습니다).
참고 사항: pid == pgid == 9373은 9373이 자신을 세션 리더라고 부르는 프로세스이기도 함을 의미합니다.