Linux: 守護進程

Linux: 守護進程

  • (一)前臺進程和后臺進程
    • 前臺進程
    • 后臺進程
  • (二)會話、進程組、進程的關系
  • (三)守護進程
    • 創建守護進程

(一)前臺進程和后臺進程

前臺進程

前臺進程是指當前正在終端中運行,并占用標準輸入、輸出和錯誤輸出的作業。它通常與用戶的交互密切相關,例如用戶正在使用的應用程序或服務。
前臺進程就是能對鍵盤文件

后臺進程

后臺進程則是指不直接與用戶交互的應用程序或服務。這類進程可能仍然在執行某些任務,但并不占據用戶的注意力。

創建后臺進程:

可執行程序 &

在這里插入圖片描述

jobs命令:
jobs 是一個用于查看當前 shell 中后臺作業狀態的內置命令。它主要用于顯示由當前 shell 啟動并仍在運行或已停止的作業列表。
在這里插入圖片描述

fg + 后臺進程號命令:
將后臺任務提到前臺
在這里插入圖片描述

bg + 后臺進程號:
將已暫停的后臺進程重啟
在這里插入圖片描述

(二)會話、進程組、進程的關系

實際上我們使用 XShell 等工具登錄 Linux 服務器時,會在服務器中創建一個 會話(bash),可以在該會話內創建 進程,當 進程 間有關系時,構成一個 進程組,組長 進程的 PID 就是該 進程組 的 PGID。
在這里插入圖片描述

我們通過下面這個例子來驗證上面的結論

sleep 1000 | sleep 2000 | sleep 3000 &sleep 100 | sleep 200 | sleep 300

在這里插入圖片描述
可以發現 每一組的進程組 PGID 都與當前組中第一個被創建的進程 PID 一致,這個進程被稱為 組長進程。無論是 后臺進程 還是 前臺進程,都是從同一個 bash 中啟動的,所以它們處于同一個 會話 中,SID 和 終端文件 TTY 都是一樣的。

每一個進程組就是執行同一個任務,只不過一個任務被分成了不用進程去執行。

Linux 中一切皆文件,終端文件也是如此,這里的終端其實就是當前 bash 輸出結果時使用的文件(也就是屏幕),終端文件位于 dev/pts 目錄下,如果向指定終端文件中寫入數據,那么對方也可以直接收到

在這里插入圖片描述
bash 進程本質上就是一個不斷運行中的 前臺進程,并且自成 進程組。

所以 SID 其實就是 bash 的 PID。在同一個 bash 中啟動前臺、后臺進程,它們的 SID 都是一樣的,屬于同一個 會話,關聯了同一個 終端。
在這里插入圖片描述

(三)守護進程

守護進程:進程單獨成一個會話,并且以后臺進程的形式運行。

應用場景:一種長期運行的后臺任務,通常用于執行諸如日志記錄、定時任務或其他需要持續運行的服務功能。

創建守護進程

方法一:
該函數用于創建守護進程,原型如下:

#include <unistd.h>
int daemon(int nochdir, int noclose);

參數說明:

  • nochdir 改變進程的工作路徑
    通常,daemon 函數會將當前工作目錄更改為根目錄(“/”),以避免當前目錄被卸載。
  • noclose 重定向標準輸入、標準輸出、標準錯誤

返回值:

  • 成功返回 0,失敗返回 -1

使用:

程序中調用 daemon(0, 0);

方法二:

通過創造會話手動 創造守護進程,系統提供的接口一鍵 守護進程化 固然方便,不過大多數程序員都會選擇手動 守護進程化(可以根據自己的需求定制操作)

該函數用于創建一個會話。創建會話需要注意不能是一個進程組的組長(即進程組的id不能是該進程的pid)

#include <unistd.h>
pid_t setsid(void);

返回值:

  • 成功返回該進程的 pid,失敗返回 -1

手動實現守護進程需注意以下幾點:

  • 忽略異常信號
    避免異常信號影響守護進程
  • 0、1、2 要做特殊處理(文件描述符)
    守護進程一般只要保持運行即可,不需要進行輸入輸出(比如服務器),若有需要關注的信息可以寫入日志中。
  • 進程的工作路徑可能要改變(從用戶目錄中脫離至根目錄)
    改變守護進程的路徑到 一個安全的位置, 避免目錄的變動影響 守護進程

使用例子:

#pragma once #include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>const std::string nullfile = "/dev/null";void _Daemon(const std::string& cwd = “”)
{// 1.忽略其他信號signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);// 2.將自己設置為獨立會話   ---創建會話需要注意不能是一個進程組的組長,通過fork函數來完成。if (fork() > 0) exit(0); // 父進程直接退出setsid();// 3.更改文件的目錄if (!cwd.empty()) chdir(cwd.c_str());// 4.將標準輸入標準輸出標準錯誤重定向到/dev/null這個垃圾桶文件中int fd = open(nullfile.c_str(), O_RDWR);if (fd > 0){// 重定向dup2(fd, 0); dup2(fd, 1);dup2(fd, 2);close(fd);}
}

/dev/dull 就是一個垃圾桶文件。

總的來說 守護進程用于在后臺運行且獨立于控制終端的特殊進程。它通常由系統啟動并持續運行,提供各種服務而不受用戶交互影響。這些進程主要用于執行定期任務、監控系統狀態以及響應網絡請求等功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84686.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6.4.5_關鍵路徑

AOE網&#xff1a; 用EEdge表示活動&#xff0c;AOV網是用Vertex頂點表示活動 僅有一個入度0的頂點叫開始頂點(源點)&#xff0c;出度0的頂點叫結束頂點(匯點) 各條邊表示活動&#xff0c;邊上的權值表示完成該活動的開銷&#xff0c;各頂點表示事件&#xff0c;事件是就發生…

Oracle 的 TX、TM、UL 鎖對比

Oracle 的 TX、TM、UL 鎖對比 Oracle 數據庫中的這三種鎖機制在并發控制中扮演著不同角色&#xff0c;以下是它們的對比分析&#xff1a; 一、基本特性對比 特性TX (事務鎖)TM (DML鎖)UL (用戶鎖)鎖類型行級鎖表級鎖應用級自定義鎖作用范圍保護數據行變更保護表結構不被修改…

Kruskal-Wallis檢驗 vs. 多次Wilcoxon檢驗:多重比較-spss

在補充圖6中&#xff0c;對喉鏡形態分類、病理類型和病程使用 Wilcoxon秩和檢驗&#xff08;Mann-Whitney U檢驗&#xff09; 結合 Bonferroni校正&#xff0c;而非 Kruskal-Wallis檢驗加Dunn’s檢驗&#xff0c;原因如下&#xff1a; 1. 方法選擇的依據 (1) 變量類型與比較組…

vue3+element-plus el-date-picker日期、年份篩選設置本周、本月、近3年等快捷篩選

一、頁面代碼&#xff1a; <template> <!-- 日期范圍篩選框 --> <el-date-picker v-model"dateRange" value-format"YYYY-MM-DD" type"daterange" range-separator"至" start-placeholder"開始日期" end-…

MySQL 關于用戶的權限信息查看

1: 先連接mysql : [rootxx ~]# mysql -u admin -p -h 8.8.8.8 -P 3306 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 38 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or …

C++ STL stack容器使用詳解

一、stack容器概述 stack容器適配器是C標準模板庫(STL)中實現后進先出(LIFO)數據結構的重要組件&#xff0c;它通過封裝底層容器&#xff08;如deque/vector/list&#xff09;提供棧操作接口。 二、stack核心操作詳解 1. 容器構造方式 // 默認使用deque存儲元素 stack<i…

科技趨勢分析系統 BBC (Big Bang of Computing)

科技趨勢分析系統 BBC (Big Bang of Computing) 技術文檔 1. 項目概述 BBC (Big Bang of Computing) 是一個基于 arXiv 論文數據的科技趨勢分析系統&#xff0c;旨在通過分析海量的學術文獻&#xff0c;結合大語言模型&#xff08;LLM&#xff09;進行增強分析&#xff0c;提…

尚硅谷redis7 55-57 redis主從復制之理論簡介

55 redis主從復制之理論簡介 定義 Redis 主從復制&#xff08;Master-Slave Replication&#xff09;是 Redis 提供的一種數據冗余和高可用機制&#xff0c;可以讓一個 Redis 主節點的數據復制到一個或多個從節點&#xff0c;實現讀寫分離、容災備份等功能。 主節點&#xff…

CarPropertyService 介紹

目錄 1. CarPropertyService 基本介紹 1.1 CarPropertyService 結構圖 1.2 CarPropertyService 的定義與實現 1.3 CarPropertyManager 與 CarPropertyService 2. PropertyHalService 與 CarPropertyService 3. CarPropertyService 的重要接口介紹 3.1 CarPropertyServi…

JavaScript 性能優化按層次逐步分析

JavaScript 性能優化實戰 &#x1f4a1; 本文數據基于Chrome 136實測驗證&#xff0c;涵蓋12項核心優化指標&#xff0c;通過20代碼案例演示性能提升300%的實戰技巧。 一、代碼層深度優化 1. 高效數據操作&#xff08;百萬級數據處理&#xff09; // 不良實踐&#xff1a;頻繁…

【東楓科技】基于Docker,Nodejs,GitSite構建一個KB站點

Docker 安裝桌面版本&#xff0c;安裝Node鏡像 運行node鏡像 需求 和外部的某個文件夾地址可以綁定端口可以綁定&#xff0c;方便server的訪問 docker run -itd --name node-test -v C:/Users/fs/Documents/GitHub:/home/node -p 3000:3000 node進入終端 docker exec -it …

【小白AI教程】大模型知識掃盲通識

目錄 一、究竟什么是大模型 二、大模型的兩大分支 2.1 在線大模型 2.2 開源大模型 2.3 大模型的應用 利用行業知識重新訓練AI大模型 利用行業知識對AI大模型進行微調 利用行業知識建立知識庫 三、Reasoning 大模型 3.1 基本概述 3.2 核心概念 3.3 技術實現 3.4 應…

測試 Gemini Pro 2.5

好的&#xff0c;我已經明白了您的需求。您希望&#xff1a; 增大概覽消息&#xff08;Toast&#xff09;的尺寸&#xff1a;使其更加醒目。消息持久性&#xff1a;當在用戶中心內部切換不同標簽頁&#xff08;例如從“個人信息”切換到“安全設置”&#xff09;時&#xff0c…

大模型——MCP 深度解析

MCP 深度解析 套用一句關于幺半群的名言:"MCP 是一種開放協議,用于標準化應用程序向 LLM 提供上下文的方式,問題何在?"但即使花數小時閱讀 MCP 的定義并實操示例,仍難以清晰把握其具體運作流程:LLM 負責什么?MCP 服務器做什么?MCP 客戶端的角色是什么?數據…

使用 scikit-learn 庫對烏克蘭沖突事件數據集進行多維度分類分析

使用scikit-learn庫對烏克蘭沖突事件數據集進行多維度分類分析 背景 在現代沖突研究中&#xff0c;對沖突事件進行多維度分析和可視化可以幫助我們更好地理解沖突的模式、趨勢和影響因素。本次作業將使用開源沖突數據&#xff0c;構建一個完整的機器學習分類流程&#xff0c;…

工作流 x 深度學習:揭秘藍耘元生代如何用 ComfyUI 玩轉 AI 開發

目錄 一、從 “代碼噩夢” 到 “積木游戲”&#xff1a;我與工作流的初次碰撞 二、深度學習&#xff1a;復雜而迷人的 “數字迷宮” &#xff08;一&#xff09;深度學習的神秘面紗 &#xff08;二&#xff09;深度學習的發展歷程 &#xff08;三&#xff09;深度學習面臨…

《軟件工程》第 14 章 - 持續集成

在軟件工程的開發流程中&#xff0c;持續集成是保障代碼質量與開發效率的關鍵環節。本章將圍繞持續集成的各個方面展開詳細講解&#xff0c;結合 Java 代碼示例與可視化圖表&#xff0c;幫助讀者深入理解并實踐相關知識。 14.1 持續集成概述 14.1.1 持續集成的相關概念 持續集…

1992-2021年各省工業增加值數據(無缺失)

1992-2021年各省工業增加值數據&#xff08;無缺失&#xff09; 1、時間&#xff1a;1992-2021年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;工業增加值 4、范圍&#xff1a;31省 5、缺失情況&#xff1a;無缺失 6、指標說明&#xff1a;工業增加值是…

Android15 Camera Hal設置logLevel控制日志輸出

這里說明三個內容 Camera Hal Demo默認使用的也是Android原生日志接口&#xff08;例如&#xff1a;ALOGD, ALOGV&#xff09;&#xff0c;為什么logLevel設置為V級別&#xff0c;但是通過ALOGV打印的日志不輸出&#xff0c;不生效Camera Hal Demo在不修改ALOGX接口使用的情況…

C++:設計模式--工廠模式

更多內容&#xff1a;XiaoJ的知識星球 目錄 1.簡單工廠模式1.1 簡單工廠1.2 實現步驟1.3 實現代碼1.4 優缺點 2.工廠模式2.1 工廠模式2.2 實現步驟2.3 實現代碼2.4 優缺點 3.抽象工廠模式3.1 抽象工廠模式3.2 實現步驟3.3 實現代碼3.4 優缺點 1.簡單工廠模式 . 1.1 簡單工廠 …