進程間關系和守護進程

一. 進程組/作業/會話
1.進程組

????每一個進程除了有一個進程ID之外, 還屬于一個進程組. 進程是一個或多個進程的集合. 通常, 它們與同一個作業向關聯, 可以接收來自同一個終端下的各種命令,信號. 每一個進程組都有唯一的進程組 ID. 每一個進程組都可以有一個組長進程. 組長進程的標識是, 其進程組 ID 等于組長進程 ID. 組長進程可以創建一個進程組, 也可以創建該進程組中的進程, 然后終止.只要該組中有一個進程存在, 則該組就存在, 與該組中的組長進程是否存在沒有任何關系

2. 相關接口函數

????????????????這里寫圖片描述
????其中getpgrp 函數用來返回調用進程的進程組 ID, setpid 用來將 pid 進程的進程組 ID 設置為 pgid, 如果兩個參數值相等, 則由 pid 指定的進程將會變成進程組組長. 如果 pid 為 0, 則使用調用者的進程 id. 另外, 如果 pgid 為 0, 則由進程 pid 指定的進程 id將會變成進程組 id.一個進程只能為自己的子進程或者為自己設定進程組ID, 但是當這個函數的子進程已經調用了 exec 之后, 父進程就不能再改變子進程的組ID了
????在大多數shell下通常是調用 fork 后讓父進程調用 setpgid , 同時也讓子進程調用 setpgid.
這里寫圖片描述????其中 ps 命令常用來顯示進程相關信息, 其中選項 a 表示不僅列出當前用戶的進程, 也列出其他所有用戶進程, x 表示不僅列出有控制終端的進程, 也列出沒有控制終端的進程, j 表示列出與作業相關的信息, 同時在上圖中可以看出當我們殺死這個進程組中的組長時, 此時該組還是任然存在的(該組中的成員還依舊在). 利用 jobs 命令可以查看后臺相關進程

3. 作業

????shell分前臺和后臺運行的不是進程, 而是作業或者進程組. 一個前臺作業可以由多個進程構成, 一個后臺作業也可以由多個進程組成, shell可以一次運行一個前臺作業和任意多個后臺作業, 這就叫做作業控制.
????作業和進程組的區別: 在作業中某個進程創建了一個子進程, 該子進程屬于該進程組, 但是該子進程不屬于這個作業.一旦作業結束, shell就把自己提到前臺, (子進程還在, 但是子進程不屬于改作業), 如果原來的前臺進程還在, (如果原來的子進程還沒有終止), 它將自動成為一個后臺進程. 此時我們就可以理解當我們在前臺起一個新作業時, 此時shell無法執行, 那是因為shell被放到了后臺, 而當改作業退出的時候, shell就被提到了前臺.

#include<stdio.h>
#include<unistd.h>int main()
{pid_t id = fork();if(id == -1){return 1;}else if(id == 0){while(1){printf("child(%d)# I am running\n", getpid());}sleep(2);}else{int i = 5;while(i){printf("parent(%d)# I am going to dead\n", getpid());i--;}sleep(2);}return 0;
}
3. 會話

????會話是一個或多個進程組的集合, 一個會話可以有一個控制終端. 這通常是登錄到其上的終端設備或者是偽終端設備. 建立與控制終端連接的會話首進程是控制進程. 一個終端下的幾個進程組可以被分為一個前臺作業以及一個或多個后臺作業.所以一個會話中應該包括一個控制進程, 一個前臺進程組和多個后臺進程組
????通過上面的一些解釋, 我們可以得知, 一個作業或者一個進程組由多個進程組成, 而一個會話則由一個前臺進程組和多個后臺進程組構成.

(1)會話相關接口

????????????????????????????????這里寫圖片描述
????該函數用于建立一個新的會話, 如果調用函數的進程不是一個進程的組長, 那么就建立新的會話. 此時該進程會變成新的會話首進程, 而此時該進程就會成為新會話中的唯一的一個進程. 而該進程會成為一個新進程組長, 該進程 ID 等于調用該進程的進程 ID. 該進程沒有控制端, 如果在調用 setsid 前該進程有一個控制端, 那么原有的這個控制端將會變成一個普通文件不再是控制終端
????????????????????????????????這里寫圖片描述
????查看進程的會話編號SID, 當 pid = 0 時, 函數返回調用進程會話首進程進程組 ID
????一個作業有多個進程構成, 一個會話由多個作業構成, 其中包括一個前臺作業和多個后臺作業, 建立一個會話, 就是會建立一個話首進程, 而刪除話首進程, 該會話將會退出.

(2)相關命令

???? 1)將一個作業放到后臺去執行時, 只需在可執行程序后面加一個 & 即可. 例如 sleep 100 | sleep 200 &
???? 2)查看后臺作業: jobs
???? 3) 將一個后臺作業由前臺提到后臺 Ctrl + Z, bg 作業號即可

4. 作業控制相關信號

???? 后臺作業是不能讀取終端輸入的, jobs 命令可以查看后臺相關作業. fg 可以將某個作業從后臺提到前臺, 但是此時如果該作業是停止狀態, 則給作業發送一個 SIGCONT 信號使得該作業能夠繼續運行. bg 將某個停止的后臺作業在后臺運行, 也需要給作業發送一個 SIGCONT 信號. 此時該作業就可以在后臺運行了.后臺作業不能從終端讀取數據, 但是后臺作業可以往終端寫數據

二.守護進程
1. 相關概念

????守護進程也叫做精靈進程, 是運行在后臺的一個特殊進程. 它獨立于控制終端, 自成進程組, 自成會話, 并且周期性地執行某些任務或者周期性地處理某些發生的事件. Linux 下大多數的服務器就是用守護進程來實現的.
???? Linux下有一些進程沒有控制終端, 不能直接和用戶交互. 其他進程都需要用戶登錄或運行時創建, 但是守護進程不受用戶登錄或注銷的影響, 它會一直運行.
這里寫圖片描述
????通過 ps 命令查看系統中的進程, 其中 PPID 是父進程編號, PID 是當前進程編號, PGID 是進程組ID, SID 是會話 ID, TTY 表示終端名稱, TPGID 表示會話組ID, STAT 表示進程狀態, UID表示用戶ID, COMMAND 表示命令字符串可以看到 凡是 TPGID 為 -1 的都是守護進程, COMMAND 用 [] 括起來的都是內核線程, 這些線程都是在內核中創建, 沒有用戶代碼, 沒有程序文件以及命令行, 通常以 k 開頭. 守護進程一般以 d 結尾的名字

2. 守護進程的創建
#include<unitd.h>
pid_t setsid();
調用成功時返回創建的會話ID, 失敗時返回 -1

????該函數在調用的時候必須保證調用的進程不能是進程組組長, 為了保證該點, 就先 fork 然后再讓子進程去執行 setsid 即可. 其中在創建會話時, 子進程就會自成組長, 即子進程的 id 就會成為其組長的id, 并且該進程也會自成會話, 即會話 ID就是該進程的 ID, 并且如果當前進程有一個會話終端的時候, 它將會失去原有的會話終端, 即原來的會話終端還是打開的, 仍然可以讀寫, 但是將會變成一個普通文件, 不再是控制終端了.

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<stdlib.h>void mydaemon()
{int fd0;pid_t id;struct sigaction sa;//1. 屏蔽umaskumask(0);id = fork();if(id < 0){perror("fork");exit(1);}//2. fork 父進程退出, 子進程運行if(id > 0){exit(0);}if(setsid() < 0){perror("setsid");exit(1);}//3. 初始化sasigemptyset(&sa.sa_mask);sa.sa_handler = SIG_IGN;sa.sa_flags = 0;//4. 對SIGCHLD信號忽略, 防止產生僵尸進程if(sigaction(SIGCHLD, &sa, NULL) < 0){perror("sigaction");exit(1);}fd0 = open("/dev/null", O_RDWR);close(0);dup2(fd0, 1);dup2(fd0, 2);
}int main()
{mydaemon();while(1){sleep(1);}return 0;
}

????????這里寫圖片描述
????關閉當前終端, 打開另外一個終端時, 繼續查看, 會發現原來的會話還存在, 于是我們可以得出結論, 守護進程單獨成組, 單獨成回話, 不受控制終端控制
????????這里寫圖片描述

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

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

相關文章

UVa1586

【題目描述】 傳送門 【題目分析】 氵 【AC代碼】 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<set> #include<map> #include<vector> …

猴子偷桃問題

http://blog.csdn.net/snow_5288/article/details/52561882 問題描述&#xff1a; /*有一群猴子&#xff0c;去摘了一堆桃子*/ /*商量之后決定每天吃剩余桃子的一半*/ /*當每天大家吃完桃子之后&#xff0c;有個貪心的小猴都會偷偷再吃一個桃子*/ /*按照這樣的方式猴子們每天都…

UVa1225

【題目描述】 傳送門 【題目分析】 做題做多了慢慢都忘記暴力了&#xff0c;想要快速算出來&#xff0c;找到規律&#xff0c;但是找來找去好復雜的都沒有找到&#xff0c;然后寫了一個不能再暴力的寫法&#xff0c;就過了。。。 我還是覺得如果數據范圍變成1e9那種級別的還…

linux 線程學習之條件變量

http://blog.csdn.net/hemmanhui/article/details/4417433 互斥鎖&#xff1a;用來上鎖。 條件變量&#xff1a;用來等待&#xff0c;當條件變量用來自動阻塞一個線程&#xff0c;直到某特殊情況發生為止。通常條件變量和互斥鎖同時使用。 函數介紹&#xff1a; 1&#xff0e;…

UVa455

【題目描述】 傳送門 【題目分析】 就是一個簡單的暴力&#xff0c;只是需要注意輸出格式比較毒瘤。 【AC代碼】 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<cmath> #i…

網絡相關基礎概念

一. 相關基礎概念 1.計算機網絡的特點 (1)連通性:計算機網絡使得上網的用戶都能夠彼此相連, 好像用戶的計算機可以直接相連 ????(2)資源共享:資源共享可以是信息共享, 軟件共享, 硬件共享等等. 由于網絡的存在, 使得用戶感覺資源就在自己身邊 2. 網絡 網絡是由若干結點和…

linux線程同步(2)-條件變量

https://www.cnblogs.com/yuuyuu/p/5140875.html linux線程同步(2)-條件變量 一.概述 上一篇&#xff0c;介紹了互斥量。條件變量與互斥量不同&#xff0c;互斥量是防止多線程同時訪問共享的互斥變量來保護臨界區。條件變量…

UVa227

【題目描述】 傳送門 【題目分析】 題目的意思很簡單&#xff0c;只是輸入輸出很毒瘤&#xff0c;我一開始用的fgets然后用scanf(" ")吃掉所有的空格和換行&#xff0c;可是這樣有可能將迷宮的空格吃掉&#xff08;例如這個空格恰好在第一行第一列&#xff09;。 …

點對點數據鏈路層

數據鏈路層的主要功能將數據轉換為相應的比特流使用的信道主要有點對點的信道方式(一對一的方式), 以及廣播的信道方式 一. 點對點信道的數據鏈路層 1. 數據鏈路和數據幀 鏈路就是從一個結點連接到相鄰結點的一段物理線路(有線或者無線), 期間不準有任何的交換結點, 因此兩臺…

UVa232

[題目描述] 傳送門 [題目分析] 簡單的模擬,注意細節 [AC代碼] #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typedef long…

linux線程同步(1)-互斥量

http://www.cnblogs.com/yuuyuu/p/5140251.html 一.概述 互斥量是線程同步的一種機制&#xff0c;用來保護多線程的共享資源。同一時刻&#xff0c;只允許一個線程對臨界區進行訪問。 互斥量的工作流程&#xff1a;創建一個…

UVa1368

[題目描述] 傳送門 [題目分析] 乍一看好像有點復雜,稍微思考一下只需要找到每個位置中最多的堿基.如果相等的話優先輸出字典序小的. [AC代碼] #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype>…

linux線程同步(3)-讀寫鎖

http://www.cnblogs.com/yuuyuu/p/5143881.html 一.概述 讀寫鎖與互斥量的功能類似&#xff0c;對臨界區的共享資源進行保護&#xff01;互斥量一次只讓一個線程進入臨界區&#xff0c;讀寫鎖比它有更高的并行性。讀寫鎖有…

樹的相關筆試面試題

1. 樹的創建 已知一個先序遍歷數的結果用數組表示, 其中空節點用 null_node 表示, 要求創建出這棵樹. 同樣采用遞歸的思想, 先定義一個指針, 指向數組中的第一個元素, 然后給數組的第一個結點創建相應的結點, 然后指針后移, 遞歸創建根節點的左子樹, 遞歸創建根節點的右子樹, …

UVa202

[題目描述] 傳送門 [題目分析] 就是一個模擬,不過稍微有點小復雜,而且輸出格式有點小毒瘤. 不過只是RE了兩發,PE了一發就過了,還是很開心. 需要注意數組要開很大,可能循環節出現在很后. 每個輸出樣例應該輸出一個空行,最后面也應該有,不然會PE [AC代碼] #include<cst…

linux線程同步(5)-屏障

http://www.cnblogs.com/yuuyuu/p/5152560.html 一.概述 barrier(屏障)與互斥量&#xff0c;讀寫鎖&#xff0c;自旋鎖不同&#xff0c;它不是用來保護臨界區的。相反&#xff0c;它跟條件變量一樣&#xff0c;是用來協同多…

淺談軟件測試

一. 什么是軟件測試 軟件測試是一個過程或者一系列過程, 用來測試計算機代碼完成了其應該完成的功能, 不執行不該有的操作.或者說軟件測試是根據軟件開發各階段的功能和說明而精心設計的一批測試用例, 并根據測試用例運行程序, 以發現程序錯誤的過程. 二. 軟件測試的心理學和…

UVa10340

【題目描述】 傳送門 【題目分析】 求字串&#xff0c;最好還是處理母串&#xff0c;每次找到一個子串就加1&#xff0c;這樣處理不用處理細節 【AC代碼】 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include&l…

淺析linux下的條件變量

一.條件變量 條件變量是用來等待線程而不是上鎖的&#xff0c;條件變量通常和互斥鎖一起使用。條件變量之所以要和互斥鎖一起使用&#xff0c;主要是因為互斥鎖的一個明顯的特點就是它只有兩種狀態&#xff1a;鎖定和非鎖定&#xff0c;而條件變量可以通過允許線程阻塞和等待另…

UVa1587

【題目描述】 傳送門 【題目分析】 剛開始想簡單了&#xff0c;認為只要相對的面相等就可以了。然后發現三個不同方向的面的邊應該有相等的關系&#xff0c;即如果兩個面公用一條邊&#xff0c;那么這兩個面的另外兩條邊就是另一個面的兩條邊。而且這三個量里面肯定有一個最…