做二手車有哪些網(wǎng)站有哪些競(jìng)價(jià)推廣代運(yùn)營(yíng)
進(jìn)程組
概念
進(jìn)程組就是一個(gè)或多個(gè)進(jìn)程的集合。
一個(gè)進(jìn)程組可以包含多個(gè)進(jìn)程。
下面我們通過(guò)一句簡(jiǎn)單的命令行來(lái)展示:
為什么會(huì)有進(jìn)程組?
- 批量操作:進(jìn)程組允許將多個(gè)進(jìn)程組織在一起,形成一個(gè)邏輯上的整體。當(dāng)需要對(duì)多個(gè)進(jìn)程執(zhí)行相同的操作時(shí),可以通過(guò)進(jìn)程組進(jìn)行操作實(shí)現(xiàn),不用對(duì)每一個(gè)進(jìn)程執(zhí)行相同的操作,這樣大大提高執(zhí)行效率。
- 任務(wù)控制:在Linux操作系統(tǒng)中,進(jìn)程組與作業(yè)控制緊密聯(lián)系。用戶可以通過(guò)作業(yè)控制指令來(lái)管理進(jìn)程組中的進(jìn)程,從而實(shí)現(xiàn)任務(wù)的啟動(dòng)、暫停、恢復(fù)、停止等功能。
- 功能聯(lián)系:進(jìn)程組中的進(jìn)程通常在功能上都有相近的聯(lián)系,它們協(xié)同工作完成特定任務(wù)。通過(guò)進(jìn)程組可以快速的管理和這些具有共同目標(biāo)的進(jìn)程。
如果只有一個(gè)進(jìn)程,是否有進(jìn)程組?
組長(zhǎng)進(jìn)程
每一個(gè)進(jìn)程組都有一個(gè)組長(zhǎng)進(jìn)程,這個(gè)進(jìn)程的PID與進(jìn)程組ID一樣。
- 作用:進(jìn)程組組長(zhǎng)可以創(chuàng)建一個(gè)進(jìn)程組
- 生命周期:從進(jìn)程組創(chuàng)建存在到其中一個(gè)最后進(jìn)程離開(kāi)為止。
會(huì)話
概念
由多個(gè)進(jìn)程組組成的集合,稱為會(huì)話(session ID)。
它提供了一個(gè)運(yùn)行環(huán)境和資源共享的上下文,包含了一組相關(guān)的進(jìn)程,這些進(jìn)程具有共同的會(huì)話標(biāo)識(shí)符(SID)。
像我們通過(guò)Xshell打開(kāi)的一個(gè)會(huì)話頁(yè)面,就是一個(gè)會(huì)話。
我們可以通過(guò)命令查看已打開(kāi)的會(huì)話:
ls /dev/pts/
setsid()
setsid() 函數(shù)在 Unix 和類 Unix 系統(tǒng)中用于創(chuàng)建一個(gè)新的會(huì)話(session),并使調(diào)用該函數(shù)的進(jìn)程成為新會(huì)話的領(lǐng)頭進(jìn)程(session leader)。這通常與創(chuàng)建守護(hù)進(jìn)程(daemon processes)相關(guān),因?yàn)槭刈o(hù)進(jìn)程需要獨(dú)立于任何控制終端運(yùn)行。
但setsid()被執(zhí)行時(shí):
- 創(chuàng)建新的會(huì)話:如果調(diào)用 setsid() 的進(jìn)程不是進(jìn)程組的領(lǐng)頭進(jìn)程,則該函數(shù)會(huì)創(chuàng)建一個(gè)新的會(huì)話,并使調(diào)用進(jìn)程成為該會(huì)話的領(lǐng)頭進(jìn)程。新會(huì)話的會(huì)話ID(SID)是該進(jìn)程的PID。
- 使調(diào)用進(jìn)程脫離控制終端:如果調(diào)用 setsid() 的進(jìn)程之前有一個(gè)控制終端,那么調(diào)用之后,該進(jìn)程將不再具有控制終端。這意味著該進(jìn)程不再是任何終端進(jìn)程組的成員,也不再與任何終端相關(guān)聯(lián)。
- 使調(diào)用進(jìn)程成為新進(jìn)程組的領(lǐng)頭進(jìn)程:調(diào)用 setsid() 會(huì)導(dǎo)致調(diào)用進(jìn)程成為一個(gè)新進(jìn)程組的領(lǐng)頭進(jìn)程,該進(jìn)程組的ID也是該進(jìn)程的PID。
注意:
如果這個(gè)進(jìn)程是進(jìn)程組的組長(zhǎng),那么將會(huì)創(chuàng)建會(huì)話失敗;為了避免這種情況,可以在子進(jìn)程里面執(zhí)行該語(yǔ)句,同時(shí)讓父進(jìn)程終止;這樣子進(jìn)程會(huì)形成一個(gè)孤兒進(jìn)程,進(jìn)程ID一定是新分配的,就不會(huì)出現(xiàn)錯(cuò)誤的情況了。
作業(yè)控制
作業(yè)是針對(duì)用戶來(lái)講,用戶完成某項(xiàng)任務(wù)而啟動(dòng)的進(jìn)程,一個(gè)作業(yè)既可以只包含一個(gè)進(jìn)程,也可以包含多個(gè)進(jìn)程,進(jìn)程之間互相協(xié)作完成任務(wù), 通常是一個(gè)進(jìn)程管道。
Shell 分前后臺(tái)來(lái)控制的不是進(jìn)程而是作業(yè) 或者進(jìn)程組。一個(gè)前臺(tái)作業(yè)可以由多個(gè)進(jìn)程組成,一個(gè)后臺(tái)作業(yè)也可以由多個(gè)進(jìn)程組成,Shell 可以同時(shí)運(yùn)?一個(gè)前臺(tái)作業(yè)和任意多個(gè)后臺(tái)作業(yè),這稱為作業(yè)控制。
例如:
守護(hù)進(jìn)程
在一個(gè)會(huì)話中,會(huì)有一個(gè)進(jìn)程是用來(lái)創(chuàng)建對(duì)應(yīng)的會(huì)話,這個(gè)進(jìn)程與會(huì)話對(duì)應(yīng)的,這個(gè)進(jìn)程被稱為守護(hù)進(jìn)程
。
守護(hù)進(jìn)程(Daemon Process)或稱為服務(wù)進(jìn)程,是在Unix、Linux及類Unix操作系統(tǒng)中運(yùn)行的一種特殊類型的后臺(tái)進(jìn)程。守護(hù)進(jìn)程獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程通常在系統(tǒng)啟動(dòng)時(shí)由系統(tǒng)初始化腳本啟動(dòng),并在系統(tǒng)關(guān)閉時(shí)關(guān)閉。它們沒(méi)有控制終端,因此它們不能接收來(lái)自終端的輸入,也不能在終端上顯示輸出。
主要特點(diǎn)
- 在后臺(tái)運(yùn)行:守護(hù)進(jìn)程在后臺(tái)運(yùn)行,不占用任何終端。
- 獨(dú)立于終端:守護(hù)進(jìn)程與啟動(dòng)它的終端無(wú)關(guān),即使啟動(dòng)它的終端被關(guān)閉,守護(hù)進(jìn)程仍然運(yùn)行。
- 周期性地執(zhí)行某些任務(wù):守護(hù)進(jìn)程可以定期執(zhí)行特定的任務(wù),如檢查系統(tǒng)狀態(tài)、備份數(shù)據(jù)等。
- 響應(yīng)系統(tǒng)事件:守護(hù)進(jìn)程也可以監(jiān)聽(tīng)系統(tǒng)事件,并在事件發(fā)生時(shí)執(zhí)行相應(yīng)的操作。
代碼演示如何創(chuàng)建一個(gè)會(huì)話
Deamon.hpp
#pragma once#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 Deamon(bool ischdir, bool isclose)
{// 1. 忽略可能引起程序異常退出的信號(hào)signal(SIGCHLD, SIG_IGN); // 忽略到子進(jìn)程創(chuàng)建的信號(hào)signal(SIGPIPE, SIG_IGN); // 忽略到管道信號(hào)// 2.創(chuàng)建子進(jìn)程,關(guān)閉父進(jìn)程if (fork() > 0)exit(0);// 設(shè)置讓自己成為一個(gè)新的會(huì)話, 后面的代碼其實(shí)是子進(jìn)程在走setsid();// 是否改變會(huì)話路徑if (ischdir)chdir(root);//成為守護(hù)進(jìn)程,將對(duì)應(yīng)的標(biāo)準(zhǔn)流進(jìn)行關(guān)閉,表示到后臺(tái)運(yùn)行了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);}}
}
main.cc
#include "Deamon.hpp"int main()
{Deamon(true,false);while(true){sleep(1);}return 0;
}
將服務(wù)器守護(hù)進(jìn)程化
鏈接:Socket編程TCP