창 관리자가 배경에 배치되면 어떻게 되나요?

창 관리자가 배경에 배치되면 어떻게 되나요?

.xsession 파일이 마지막 프로세스가 포그라운드에 있을 것으로 예상하는 이유를 이해하려고 노력 중입니다. 그렇지 않으면 X11 세션이 중지되어야 합니다.

작은 독립형 스크립트가 있습니다. 실행하면 "less"가 배경에 있기 때문에 즉시 종료됩니다.

$ ls -l total 4
-rwxr-xr-x 1 user user 17 Feb 28 21:17 a
-rw-r--r-- 1 user user  0 Feb 28 20:22 b 
$ cat a 
less b & 
echo $!
  1. 나는 "적은" 도구가 주로 포그라운드에서 상호 작용한다는 것을 이해합니다. 어떻게 하는지는 모르겠지만 더 이상 포그라운드에서 실행되지 않고 입력을 받을 수 없거나 사용자에게 일부 출력을 표시할 수 없다는 것을 인식한 것 같습니다. 따라서 실행은 더 이상 유용하지 않으므로 종료됩니다. 아니면 정확히 무슨 일이 일어났나요?

  2. 창 관리자를 백그라운드에 놓으면 왜 종료되나요? 포그라운드에서 실행되지 않고 X 서버를 통해 키보드/마우스 입력을 받을 수 없고 더 이상 유용하지 않기 때문에 종료됩니까?

답변1

이것은 실제로 완전히 다른 두 가지 현상입니다.

less백그라운드에 있는지 자체적으로 확인하지 않습니다(터미널과 상호 작용하는 프로그램의 경우 일반적임). 프로세스 1의 프로세스는 커널의 일반 터미널 드라이버에 의해 추적됩니다.전망. 포그라운드 프로세스(보다 정확하게는 프로세스 그룹)는 하나만 있을 수 있습니다. 쉘은 시스템 호출을 합니다(tcsetpgrp) fg내장 함수를 사용하여 프로세스를 전경으로 가져올 때. 이 시스템 호출은 지정된 프로세스를 포그라운드 프로세스로 만듭니다.

프로세스가 터미널²에서 데이터를 읽으려고 시도할 때 터미널 드라이버는 프로세스가 포그라운드에 있지 않은 경우 프로세스에 SIGTTIN 신호를 보냅니다. 기본적으로 이 신호는 프로세스를 정지시킵니다(예: SIGSTOP). 마찬가지로 제어 터미널에 쓰기를 시도하는 백그라운드 프로세스는 SIGTTOU를 수신합니다. 대부분의 쉘은 이런 일이 발생하면 일반적으로 메시지를 표시합니다 [1] + suspended (tty output) less myfile.

단말기에 대한 자세한 내용은 단말기 설명을 참고하세요.범용 터미널 인터페이스POSIX 표준에서. (이 책은 쉽게 읽을 수 있는 책이 아닙니다. 대부분의 사용자보다 훨씬 많은 내용을 담고 있으며 더 많은 프로그래머가 알아야 할 것입니다.)

창 관리자는 터미널과 상호 작용하지 않으므로 터미널의 백그라운드 및 포그라운드 프로세스 개념이 적용되지 않습니다. X 세션이 종료되면 X Server 3도 종료됩니다. 창 관리자를 호출하는 스크립트는 세션에서 수행할 작업을 알려줍니다. 창 관리자를 백그라운드에 두고 창 관리자를 기다리지 않고 세션 스크립트가 종료되도록 하면 세션이 예상보다 일찍 종료됩니다.

¹무엇프로세스 그룹, 실제로는 (파이프와 비슷하지만) 여기서는 자세히 설명할 필요가 없습니다.
² 해당제어 터미널실제로.
³ 애플리케이션에서 창 그리기, 입력 읽기 등과 같은 명령을 실행하는 GUI의 백엔드 부분입니다.

답변2

창 관리자가 전경, 배경 또는 어떤 종류의 작업 제어 하에 있어야 한다는 요구 사항은 없습니다. 원하지 않으면 창 관리자를 실행할 필요조차 없습니다!

유일하게 중요한 점은 .xsession스크립트가 종료되면 세션도 종료된다는 것입니다. 종료 되면 .xsessionX 서버 자체도 종료되며, 아직 연결되어 있는 모든 프로세스는 강제 종료됩니다.

따라서 .xsession스크립트는 일반적으로 스크립트가 마지막으로 실행하는 작업이 세션과 관련된 일종의 장기 실행 프로세스가 되도록 작성됩니다. 창 관리자 또는 세션 관리자일 수 있습니다(현대적인 고급 데스크톱 환경에서 더 일반적임). 프로세스는 exec실행 중인 쉘을 대체하도록 실행되거나 .xsession쉘이 이를 기다리도록 포그라운드 프로세스로 실행됩니다. 어느 쪽이든 프로세스가 종료되면 세션이 종료됩니다.

예제 셸 스크립트는 less백그라운드에서 시작된 다음 즉시 종료됩니다. 백그라운드 프로세스를 기다리지 않습니다. 종료 여부에 관계 없이 less종료됩니다 . less백그라운드에서 계속 실행될 수 있지만 쉘 스크립트를 어떻게 실행하든 눈치 채지 못할 것입니다. .xsession동일한 방식으로 작성된 스크립트에서도 동일한 문제가 발생합니다.

관련 정보