【Linux專欄】Linux進程間關系和守護進程

在這里插入圖片描述

文章目錄

  • 1、進程間關系
    • 1.1 進程組
    • 1.2 組長進程
  • 2、會話?
    • 2.1 查看會話
    • 2.2 創建會話
  • 3、控制終端
  • 4、作業控制
    • 4.1 前臺/后臺進程
  • 5、守護進程
    • 5.1 如何創建守護進程?
    • 5.2 殺掉守護進程

1、進程間關系

主要描述兩個名稱概念:即進程組和組長進程。

1.1 進程組

什么是進程組?通過名稱可以看到它包含很多進程,所有進程在一個組內,當然名稱雖然是進程組,其實在Linux中,單個進程也是有自己的組。首先,通過看一個進程在Linux中是如何描述的?
在這里插入圖片描述

PPID: 表示該運行的進程所屬的父進程ID信息,即該進程的父親。
PID:表示該運行進程的唯一標識符。
PGID:表示改進程所屬進程組的ID,(由于是單進程因此進程組ID就是自己的PID,也就是為什么說進程組中可以有一個進程。)
SID:表示會話ID信息
TTY:表示該進程所屬于哪一個終端,(顯示的是終端號,本質就是在/dev/pts下的一個文件)
UUID:表示是哪一個用戶執行的該進程,即用戶名,只不過Linux中是用數字描述的。

我們看到描述一個進程的信息有PPID、PID、PGID等,接下來要講述的就是PGID?
首先來看一個指令,該指令是由3個相同的指令組合,用管道連接的 ,我們知道在Linux中一條運行的指令就是一個進程。
在這里插入圖片描述
從圖中可以看到啟動了3個進程,他們同屬于一個組,因為PGID都是393911,仔細觀察看到該進程組ID就是第一個運行起來的進程PID。
總結就是:當多個進程在運行時候,他們有各自的PPID、PID,但是PGID是相同的,因為是一個進程組,并且規定進程組ID就是第一進程執行時的PID。
上面看到的是由多個進程組成的進程組,所描述的信息就是上面所展示的,那么只有一個進程運行的時候又是如何描述的?如下顯示的:
在這里插入圖片描述
上面就是單個進程運行時,他的進程組就是自己的PID,也符合:第一個進程運行的PID作為PGID。
看到多個進程和單個進程的進程組描述如上,那么當我們在一個進程中又創建了子進程,然后讓父進程直接退出,此時進程又是如何描述的?如下:
在這里插入圖片描述
可以看到當一開運行進程的時候,父進程在程序中設置的是延時5秒,此時進程有自己的PPID、PID、PGID,由于是單進程組成的進程組,所以是自己的PID,當5秒結束后,程序中緊接著創建子進程,并且讓父進程直接退出,此時該進程就變為了孤兒進程,被1號進程領養,但所屬的進程組ID是不變的,還是第一個進程運行的PID,只是PID變為了子進程的PID了。

總結:在多進程中實際上以進程組的關系執行的,進程組就是一個或多個進程的集合,一個進程組可以有多個進程,也可以只有一個進程。PGID就是第一運行進程的PID,同時只有當最后一個進程退了,該組才全部退出,與組長進程是否退出沒有關系。

1.2 組長進程

通過上面的描述,顯而易見組長進程就是在進程組中第一個運行的進程,對應的PGID就是該進程的PID。
查看對應列屬性的數據指令:ps -eo 對應進程列屬性

2、會話?

會話和上面的進程組有關系,即在一個會話中可以包含一個或者多個進程組,因此一個或多個進程組集合就是一個會話。

2.1 查看會話

在這里插入圖片描述
通過上面的圖可以看出,每創建一個終端登錄界面,登錄后就會有對應的SID,因此會話就可以理解為從用戶登錄該終端開始到該終端退出關閉,在該過程中所操作的所有事。通過SID,即會話ID來區分不同會話區。

2.2 創建會話

在看到會話所表示的區域后,我們自己如何創建新的會話呢?
即通過setseid函數創建會話。該函數使用前提就是不能讓組長進程來創建會話。
#include <unistd.h>
/*
*功能:創建會話
*返回值:創建成功返回 SID, 失敗返回-1 */
pid_t setsid(void);

為了不讓創建的進程是組長進程,通常是在進程中創建子進程來創建會話。

3、控制終端

簡單來說,控制終端就是用戶在通過終端登錄系統過后得到的一個shell進程,登陸后所在的終端就是該shell的控制終端。控制終端保存在PCB中的,因此在shell中啟動的所有進程都屬于該登錄的終端。 每個進程的標準輸入、輸出、錯誤都會指向該控制終端。在理解控制終端后,它還和會話、進程組有這些關系:
①一個會話擁有一個控制終端,通常打開的首個會話進程打開終端后,該終端就是該會話的控制終端。
②和控制終端建立的會話的首進程叫控制進程。
③在一個會話中的多個進程組中可以被分為一個前臺進程組和一個或多個后臺進程組。控制終端的指令只能發送給前臺進程組。

4、作業控制

什么是作業?每個學生都知道作業這件事,但這里的作業是指用戶為了完成某件事而啟動的進程。一個作業可以包含一個進程或者是進程組,進程之間相互協調。
作業控制?
誰控制?在Shell中分前后臺來控制,控制的就是作業或者是進程組。一個前臺作業可以是多個進程組,后臺也可以是多個。Shell可以同時運行一個前臺作業或多個作業前臺作業,即為作業控制。

4.1 前臺/后臺進程

我們用戶輸入執行程序指令時大多數都是前臺運行的,前臺運行有個特點就是只有等前臺運行結束后用戶再輸入指令才有用,才會被控制終端接收。
./exe:該方式運行的就是前臺進程。
變為后臺進程方式:./exe &
在同一個會話中,可以允許多個后臺進程(組),但前臺進程(組)只允許一個。
前后臺進程的標志:看誰應該從標準輸入中獲取數據。明確的是只有前臺進程才可以獲取。
把后臺變為前臺:fg 進程名,也可以通過作業號進行移動。
前臺變為后臺:先停止前臺進程(ctrl+z),在bg 進程名

5、守護進程

守護進程不受控制終端關閉的影響,而是長時間運行的。我們就是把在會話的中的進程組拿出來放在單獨的放到獨立的會話中,此時該進程組就是守護進程。
那么如何創建會話,前面說了通過setsid()函數,注意不能是組長進程。
既然不能是組長進程,我們在寫程序的時候,主函數中就是父進程,第一個先運行的,即為組長進程,因此不能在主函數中創建會話,需要在子進程中創建會話。讓父進程直接退出。此時就會想到孤兒進程,因此守護進程就是孤兒進程的一種特殊。

5.1 如何創建守護進程?

步驟:
①忽略信號。
②創建子進程,在其中創建會話。
③更改工作目錄。
④重定向標準輸入輸出到/dev/null。

#pragma once#include<iostream>
#include<string>
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>//更改工作目錄
const char *root="/";//根目錄
const char *dev_null="/dev/null";void Demo(bool isChdir,bool isClose)
{//1、忽略可能引起程序錯誤的信號signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);//2、創建子進程if(fork()>0){exit(0);//父進程退出}//3、子進程中創建會話setsid();//4、查看是否更改CWDif(isChdir){chdir(root);//更改為根目錄}//5、此時已經是守護進程了,不需要和用戶的標準輸入、輸出、錯誤關聯if(isClose){close(0);close(1);close(2);}else{//也可以重定向int fd=open(dev_null,O_RDWR);if(fd>0){//后者重定向到前者dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}}
}

通過調用編寫的函數,把進程變為守護進程

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include "Demo.hpp"
int main()
{// sleep(5);// if(fork()>0)// {//     exit(1);// }// while(1)// {//     std::cout<<"child PPID:"<<getppid()<<" PID:"<<getpid()<<std::endl;//     sleep(1);// }//Demo(false, false);while (1){std::cout << "hello" << std::endl;sleep(1);}return 0;
}

5.2 殺掉守護進程

kill -9 PID

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

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

相關文章

電商物流管理優化:從網絡重構到成本管控的全鏈路解析

大家好&#xff0c;我是沛哥兒。作為電商行業&#xff0c;我始終認為物流是電商體驗的“最后一公里”&#xff0c;更是成本控制的核心戰場。隨著行業競爭加劇&#xff0c;如何通過物流網絡優化實現降本增效&#xff0c;已成為電商企業的必修課。本文將從物流網絡的各個環節切入…

ubuntu 更新華為源

1. 備份配置文件 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 2. 修改source.list 文件&#xff0c;將http://archive.ubuntu.com和http://security.ubuntu.com替換成http://repo.huaweicloud.com&#xff0c;可以參考如下命令&#xff1a; # 第一條指令 s…

CS016-4-unity ecs

【37】將系統轉換為任務 Converting System to Job 【Unity6】使用DOTS制作RTS游戲|17小時完整版|CodeMonkey|【37】將系統轉換為任務 Converting System to Job_嗶哩嗶哩_bilibili a. 將普通的方法&#xff0c;轉化成job。第一個是寫一個partial struct xxx&#xff1b;第二…

如何使用 React Hooks 替代類組件的生命周期方法?

文章目錄 1. 引言2. useEffect 概述3. 模擬類組件的生命周期方法3.1 模擬 componentDidMount3.2 模擬 componentDidUpdate3.3 模擬 componentWillUnmount 4. 多個 useEffect 的使用5. 注意事項6. 總結 1. 引言 在 React 16.8 版本之前&#xff0c;開發者主要通過類組件&#x…

盒帶自編教材《軟件工程》目錄

目錄 前言 第1章 軟件工程概述 1.1 軟件概述 1.1.1 軟件的定義 1.1.2 軟件的特點 1.1.3 軟件的分類 1.1.4 軟件的發展 1.2 軟件危機 1.2.1 什么是軟件危機 1.2.2 產生的原因及解決途徑 1.3 軟件工程 1.3.1 軟件工程定義 1.3.2 軟件工程的研究內容 1.3.3 軟件工程的目標和原則…

CAN通信協議傳輸數據,為什么喜歡低位在前高位在后?而RS485則更傾向高位在前低位在后?

CAN 通信協議通常采用低位在前&#xff08;小端字節序&#xff09;&#xff0c;而 RS - 485 本身沒有固定要求高位在前或低位在后&#xff0c;其數據傳輸順序更多取決于具體應用和上層協議。 CAN 通信協議低位在前的原因 硬件設計與實現角度 邏輯電路處理便捷&#xff1a;數…

NGINX 安全性:持續進化的防護能力,為您的應用保駕護航

在數字時代,網絡安全的重要性不言而喻。任何暴露在互聯網上的應用都可能成為攻擊者的目標。作為互聯網基礎設施的關鍵組成部分,NGINX 不僅是高性能的 Web 服務器和反向代理,更在應用安全防護方面扮演著至關重要的角色。它就像您數字資產的“第一道防線”和“智能門禁”,憑借…

makefile細節說明

在 Makefile中&#xff0c;依賴關系的左右兩部分有特定的名稱&#xff1a; ??左邊部分&#xff08;冒號左側&#xff09;?? 稱為 ??目標&#xff08;Target&#xff09;?? ??右邊部分&#xff08;冒號右側&#xff09;?? 稱為 ??依賴項&#xff08;Prerequisite…

Zephyr OS Nordic芯片的Flash 操作

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 Flash操作庫函數 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函數 2.2.2 nrfx_nvmc_page_erase函數 2.2.3 nrfx_nvmc_write_done_check 函數 3 操作Flash的接口函數…

03、基礎入門-SpringBoot的大時代背景

03、基礎入門-SpringBoot的大時代背景 # Spring Boot的大時代背景 Spring Boot的出現和發展&#xff0c;與以下時代背景密切相關&#xff1a; ## 1. 微服務架構的興起 ### 背景 隨著互聯網應用的復雜度增加&#xff0c;傳統的單體架構在擴展性、維護性和團隊協作方面遇到瓶…

ChromaDB 向量庫優化技巧實戰

chroma 一步步使用 安裝 # 安裝chromadb pip install chromadb,sentence_transformers# 不啟動服務會出現sock.connect(sa)TimeoutError: timed out chroma run服務啟動后&#xff0c;您將看到類似以下輸出&#xff1a; 建立連接 部署完成后&#xff0c;需要建立與Chroma服…

全球泳裝與沙灘裝市場深度洞察:從功能性需求到可持續時尚的蛻變(2025-2031)

泳裝與沙灘裝作為水上活動與度假場景的核心服飾&#xff0c;正經歷從單一功能性產品向“科技時尚可持續”融合的轉型。根據QYResearch預測&#xff0c;2031年全球市場規模將達2512.4億元人民幣&#xff0c;年復合增長率&#xff08;CAGR&#xff09;4.0%&#xff08;2025-2031&…

WebRTC技術下的EasyRTC音視頻實時通話SDK,助力車載通信打造安全高效的智能出行體驗

一、方案背景? 隨著智能交通與車聯網技術的飛速發展&#xff0c;車載通信在提升行車安全、優化駕駛體驗以及實現智能交通管理等方面發揮著越來越重要的作用。傳統的車載通信方式在實時性、穩定性以及多媒體交互能力上存在一定局限&#xff0c;難以滿足現代車載場景日益復雜的…

主流數據庫運維故障排查卡片式速查表與視覺圖譜

主流數據庫運維故障排查卡片式速查表與視覺圖譜 本文件將主文檔內容轉化為模塊化卡片結構&#xff0c;并補充數據庫結構圖、排查路徑圖、鎖機制對比等視覺圖譜&#xff0c;以便在演示、教學或現場排障中快速引用。 &#x1f4cc; 故障卡片速查&#xff1a;連接失敗 數據庫檢查…

升級kafka4.0.0,無ZK版本

設備規劃&#xff1a; 172.20.192.47 kafka-0 172.20.192.48 kafka-1 172.20.192.49 kafka-2 單機塊7TB Nvme磁盤一共9塊 # 格式化成GPT分區 sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme1n1 --script mklabel gpt sudo parted /dev/nvme2n1 --s…

Vue 學習隨筆系列二十三 -- el-date-picker 組件

el-date-picker 組件 文章目錄 el-date-picker 組件el-date-picker 只有某些日期可選 el-date-picker 只有某些日期可選 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…

使用Python實現簡單的人工智能聊天機器人

最近研學過程中發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊鏈接跳轉到網站人工智能及編程語言學習教程。讀者們可以通過里面的文章詳細了解一下人工智能及其編程等教程和學習方法。下面開始對正文內容的…

[QMT量化交易小白入門]-五十四、核心資產ETF輪動目前年化只有74%了,在過濾掉當天止損,當天買入的之后

本專欄主要是介紹QMT的基礎用法,常見函數,寫策略的方法,也會分享一些量化交易的思路,大概會寫100篇左右。 QMT的相關資料較少,在使用過程中不斷的摸索,遇到了一些問題,記錄下來和大家一起溝通,共同進步。 文章目錄 相關閱讀買入邏輯詳解代碼塊作用解析止損邏輯詳解代碼…

實戰解析MCP-使用本地的Qwen-2.5模型-AI協議的未來?

文章目錄 目錄 文章目錄 前言 一、MCP是什么&#xff1f; 1.1MCP定義 1.2工作原理 二、為什么要MCP&#xff1f; 2.1 打破碎片化的困局 2.2 實時雙向通信&#xff0c;提升交互效率 2.3 提高安全性與數據隱私保護 三、MCP 與 LangChain 的區別 3.1 目標定位不同 3.…

數據中心末端配電監控產品

精密配電介紹 數據中心配電系統圖 交流220V和直流-48V、240V、336V(400V)對比 產品簡介 AMC精密配電監控解決方案是針對精密配電柜&#xff08;列頭柜&#xff09;的監控要求&#xff0c;設計開發一套完整的解決方案&#xff0c;包括交流&#xff08;AC 220V&#xff09;、直…