Process
將視窗管理器置於後台時會發生什麼
我試圖了解為什麼 .xsession 文件期望最後一個程序處於前台的情況,否則它應該停止 X11 會話。
我有一個小的獨立腳本。當我執行它時,它會立即退出,因為“少”是在後台。
$ 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 $!
- 我了解“更少”工具主要在前台互動。我不知道它是如何實現的,但我猜它意識到它不再在前台執行並且它無法獲取輸入或向使用者顯示一些輸出,因此執行不再有用所以它退出了。或者真正發生了什麼?
- 當您在後台放置“視窗管理器”時,它為什麼會退出?它退出是因為它沒有在前台執行並且無法通過 X 伺服器獲得任何鍵盤/滑鼠輸入並且它不再有用所以它退出了嗎?
這實際上是兩種完全不同的現象。
less
本身不會檢查它是否在後台(這是與終端互動的程序的典型)。核心中的通用終端驅動程序跟踪前台的程序¹ 。只能有一個前台程序(更準確地說是一個程序組)。當使用內置函式將程序置於前台時, shell 會進行系統呼叫 (tcsetpgrp
) 。fg
該系統呼叫使指定程序成為前台程序。當程序試圖從終端²讀取時,如果它不在前台,終端驅動程序會向程序發送 SIGTTIN 信號。預設情況下,此信號會暫停程序(如 SIGSTOP)。類似地,嘗試寫入其控制終端的後台程序會收到 SIGTTOU。大多數 shell 通常會
[1] + suspended (tty output) less myfile
在發生這種情況時顯示一條消息。有關終端的更多資訊,請參見POSIX 標準中對通用終端介面的描述。(這並不容易閱讀。它比大多數使用者甚至更多程序員需要知道的要多得多。)
視窗管理器不與終端互動,因此終端中後台和前台程序的概念不適用於它。那裡發生的事情是 X 伺服器³在 X 會話終止時終止。呼叫視窗管理器的腳本告訴在會話中要做什麼。如果您將視窗管理器置於後台並讓會話腳本退出而不等待視窗管理器,這會導致會話比您預期的更早結束。
¹實際是什麼流程組(例如管道),但我們不需要在這裡詳細介紹。
²實際上只對其控制端。
³ GUI 的後端部分,執行命令以從應用程序中繪製視窗、讀取輸入等