【孤儿进程】孤儿进程组、守护进程
生活随笔
收集整理的這篇文章主要介紹了
【孤儿进程】孤儿进程组、守护进程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、孤兒進程組
1. 孤兒進程的定義:
定義1:該進程組的每個成員的父進程要么是該組的成員,要么在其它會話中。
定義2:一個進程不是孤兒進程組的條件是——該組有一個進程,其父進程在屬于同一會話的另一個組中。
只要能夠滿足上面其中的任一個定義,則此進程組就是孤兒進程組。可能讀起來比較拗口,看圖 1 中的例子可能會清楚點。
? ? ?
? ? ? ? ? ? ? ? ?
圖 1 中,按照孤兒進程組的定義:
- 進程組 1 不是孤兒進程組,因為進程組 1 中有一個進程的父進程不屬于進程組 1,也不在另一個會話中。
- 進程組 2 是孤兒進程組,因為該組中的每個成員滿足定義:每個成員的父進程要么在本組中,要么在其它會話中。
?
2.? 孤兒進程組的特性:
如果進程組存在停止狀態的進程,當該進程組變成孤兒進程組時,POSIIX.1要求向新孤兒進程組中的每一個進程發送掛斷(SIGHUP),接著又向其發送繼續信號(SIGCONT)。
3. 測試代碼:
#include <unistd.h> #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void handler(int signo) {printf("SIGHUP receive, pid = %d\n", getpid()); }void pr_ids(char* name) {printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n", name,getpid(), getppid(), getpgid(getpid()), tcgetpgrp(0));fflush(stdout); }int main() {char c;pid_t pid;pr_ids("parent");pid = fork();if (pid < 0){perror("fork");}else if (pid > 0){sleep(5);}else{pr_ids("child");signal(SIGHUP, handler);kill(getpid(), SIGTSTP); // 讓子進程暫停pr_ids("child"); // 如果執行了此行,說明已經收到了 SIGHUP 信號if (read(STDIN_FILENO, &c, 1) != 1)printf("read error, error number: %d\n", errno);}exit(0); }輸出結果:
?
參考資料
1.?孤兒進程與孤兒進程組
總結
以上是生活随笔為你收集整理的【孤儿进程】孤儿进程组、守护进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前台进程组、后台进程组
- 下一篇: 明日之后秘密起点副本在哪