*在用戶訪問端口時,操作系統會形成對應的session,在其的內部進一步形成bash等進程?
*一個會話只有一個前臺進程,可以有多個后臺進程,前臺與后臺進程的區別在于誰擁有鍵盤的使用權
*前臺與后臺進程都可以訪問顯示器但是后臺無法訪問標準輸入獲取數據
下面介紹相關接口
?示例代碼
前臺運行
后臺運行?
查看后臺進程:
在 Linux 系統中, jobs ?是一個常用的 shell 命令,用于查看當前終端會話中在后臺運行或暫停的作業(進程)?
后臺調前臺:
- ?fg?:不加參數時,默認操作 ?jobs??列表里帶 ?+??標記(當前默認)的后臺作業,將其移到前臺執行。
- ?fg %作業號?:指定作業號(通過 ?jobs??查看的 ?[n]??編號),精準調對應后臺作業到前臺,例 ?fg %1??調作業號為 ?1??的任務。
??恢復暫停任務:
按 ?Ctrl + Z??暫停前臺任務 → 用 ?bg? n??讓它后臺繼續,或 ?fg %n??直接前臺恢復執行。?
觀察圖片
ppid及pid我們已經很熟悉,pgid(進程組id) sid(session id)則較為陌生。
進程組可以簡單理解為:把多個相關的進程(比如一個程序啟動后自己創建的子進程,或共同完成一項任務的多個進程)打包成的一個“小組”。
這個“小組”有兩個關鍵特點:
- 每個小組有唯一的編號(進程組ID),通常用組里第一個創建的進程(組長)的ID來標識。
- 對這個小組操作(比如發停止信號),組里所有進程都會“收到”并響應。
比如你用命令啟動一個程序,程序運行時又開了幾個子進程,這些進程就自動組成一個進程組,方便統一管理(比如關閉終端時一起結束,或用快捷鍵統一暫停)。
遠端登陸session退出時后臺進程理論也退出,但是,遠端情況實際上后臺進程沒有退出終止,而是托孤給了操作系統,但是仍然會受用戶登陸影響其屬性,想讓后臺進程不受到任何用戶登錄和注銷的影響,就需要用到守護進程,原理是后臺切會話
接口setsid:
setsid??是 Unix/Linux 系統中的一個系統調用(也有同名命令),核心作用是創建一個新的會話(session),并讓調用它的進程成為這個會話的“領頭進程”(session leader),同時脫離原有的進程組和控制終端。
簡單理解
可以把它看作是讓進程“獨立門戶”的操作:
- 原本進程可能屬于某個進程組,受某個終端(比如命令行窗口)控制(終端關閉時,進程可能被終止)。
- 調用 ?setsid??后,進程會脫離原來的進程組,自己成立一個新的會話,并且不再有控制終端。這意味著它不會被終端的關閉、退出信號影響,適合作為后臺服務(如守護進程)運行。
關鍵效果
1.?進程成為新會話的領頭進程;
2.?進程成為一個新進程組的組長;
3.?進程與原控制終端徹底脫離(不再接收終端的信號,比如 ?Ctrl+C??不會終止它)。
典型用途
最常見的是創建“守護進程”(daemon),比如服務器程序。例如,后臺運行的 Web 服務器、數據庫服務等,通過 ?setsid??脫離終端控制,即使關閉啟動它的終端,進程也能繼續運行。
命令行中也可以直接使用 ?setsid??命令,比如 ?setsid sleep 1000?,這個 ?sleep??進程會脫離當前終端,在后臺獨立運行。
手撕代碼如下?
分析
2:后臺切會話時,不能是前臺任務向繪畫轉變,因此我們需要保證,這個轉會話的進程不能是第1個創建的,因此我們以紫進程進行切換就可以保證不是第1個進程進行切換?
4:在進程的運行過程中,可能會出現許多的輸出打印情況,而這些輸出的內容,我們不需要他在顯示器上呈現,因而我們就需要重載文件描述符0.1.2,將這些內容輸進垃圾桶中,及/dev/null
系統接口
“daemon”(守護進程),它是運行在操作系統后臺的一種特殊進程,主要特點和作用如下:
核心特點
- 后臺運行:不依賴終端,啟動后在后臺持續工作,用戶通常看不到它的界面。
- 自動啟動:很多守護進程會隨系統啟動而運行,比如服務器的網絡服務進程。
- 獨立穩定:脫離終端控制,即使關閉啟動它的終端,也能繼續運行,且通常會長期穩定工作,除非被手動終止或系統關閉。
常見用途
- 提供系統服務:比如 Linux 中的 ?sshd?(遠程登錄服務)、?httpd?(網頁服務器),Windows 中的“服務”(如自動更新服務)。
- 處理后臺任務:比如定時任務調度(?crond?)、日志收集、網絡數據監聽等。
簡單說,守護進程就像“隱形的服務員”,在后臺默默處理系統或應用的各種任務,保證服務持續可用。?
?