淺談三種特殊進程:孤兒進程,僵尸進程和守護進程

昨天學了進程控制,就這三種特殊的進程研究了一下,其中也借鑒了一些前人總計的經驗。

1、孤兒進程

如果父進程先退出,子進程還沒退出那么子進程將被 托孤給init進程,這里子進程的父進程就是init進程(1號進程).其實還是很好理解的。

// 父進程先子進程退出
// 子進程會被祖父進程接手并在后臺運行,執行內部的代碼
int main()
{pid_t pid = fork();switch (pid){case -1:perror ("fork");break;case 0:             // 子進程close (1);// 創建一個文件用來保存輸出的文字int fd = open ("child", O_RDWR|O_CREAT, 0777);printf ("我是子進程,我的ID是%d\n", getpid());while (1){printf ("找爸爸\n");fflush (stdout);sleep (2);}break;default:            // 父進程printf ("我是父進程:ID = %d\n", getpid());printf ("我走啦\n");while (1);break;}return 0;
}

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述
在這里我們運行了程序,可以在另一終端看到有2個a.out在運行,我們將父進程終止,子進程并沒有退出,而是在后臺繼續運行,并向child文件中輸出文字。

2、僵尸進程
這里寫圖片描述
如果我們了解過Linux進程狀態及轉換關系,我們應該知道進程這么多狀態中有一種狀態是僵死狀態,就是進程終止后進入僵死狀態(zombie),等待告知父進程自己終止,后才能完全消失.但是如果一個進程已經終止了,但是其父進程還沒有獲取其狀態,那么這個進程就稱之為僵尸進程.僵尸進程還會消耗一定的系統資源,并且還保留一些概要信息供父進程查詢子進程的狀態可以提供父進程想要的信息.一旦父進程得到想要的信息,僵尸進程就會結束.

// 子進程比父進程先退出
int main()
{int count = 5;while (count--){//signal(SIGCHLD,SIG_IGN);pid_t pid = fork();switch (pid){case -1:perror ("fork");break;case 0:         // 子進程printf ("我是子進程,我的ID是%d\n", getpid());printf ("我走啦\n");exit (0);default:        // 父進程printf ("我是父進程,我的ID是%d\n", getpid());//while(1);break;}}while(1);return 0;
}

這里寫圖片描述

signal(SIGCHLD,SIG_IGN);加上這行代碼后僵尸進程都消失了。
這里寫圖片描述
通過ps -ef | grep a.out 我們可以得知進程信息和進程pid,可以看到子進程就是處于defunct狀態.這時我們肯定想要怎么才能避免僵尸進程呢?看程序被我注釋的那句signal(SIGCHLD,SIG_IGN),加上就不會出現僵尸進程了.那我們就加點篇幅講一下為什么就可以避免僵尸進程呢?
這是signal()函數的聲明sighandler_t signal(int signum, sighandler_t handler),我們可以得出,signal函數的第一個函數是linux支持的信號,第二個參數是對信號的操作 ,是系統默認還是忽略或捕獲.我們這是就可以知道signal(SIGCHLD,SIG_IGN)是選擇對子程序終止信號選擇忽略,這是僵尸進程就是交個內核自己處理,并不會產生僵尸進程.

3、守護進程
同樣我們需要了解一下什么是守護進程,守護進程就是在后臺運行,不與任何終端關聯的進程,通常情況下守護進程在系統啟動時就在運行,它們以root用戶或者其他特殊用戶(apache和postfix)運行,并能處理一些系統級的任務.習慣上守護進程的名字通常以d結尾(sshd),但這些不是必須的.

下面介紹一下創建守護進程的步驟:

· 調用fork(),創建新進程,它會是將來的守護進程.
· 在父進程中調用exit,保證子進程不是進程組長
· 調用setsid()創建新的會話區
· 將當前目錄改成跟目錄(如果把當前目錄作為守護進程的目錄,當前 目錄不能被卸載他作為守護進程的工作目錄)
· 將標準輸入,標注輸出,標準錯誤重定向到/dev/null

// 守護進程
int daemonize (int nochdir, int noclose)
{// 創建子進程,關閉父進程pid_t pid = fork();if (pid > 0)        // 父進程{exit (0);}else if (pid < 0){return -1;}// 2、設置文件的掩碼,mode & ~umaskumask (0);// 3、設置新的會話:脫離當前會話和終端的控制if (setsid() < 0){return -1;}// 當nochdir為0時,daemon將更改進程的根目錄為rootif (0 == nochdir){// 改變當前的工作目錄if (chdir ("/") < 0){return -1;}}// 標準輸入、關閉標準輸出、標準錯誤close (STDIN_FILENO);close (STDOUT_FILENO);close (STDERR_FILENO);if (0 == noclose){// 重定向標準輸入、關閉標準輸出、標準錯誤open ("dev/null", O_RDONLY);    // 0open ("dev/null", O_RDWR);      // 1open ("dev/null", O_RDWR);      // 2}return 0;
}int main()
{daemonize (0, 0);// daemon (0,0);          // 系統自帶守護進程while (1);return 0;
}

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

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

相關文章

設計師為什么要學編程,開發者為什么要學設計?

摘要&#xff1a;設計師和開發者目前正處于互聯網的兩端&#xff0c;看著彼此做不同的工作。如果他們能互相學習對方的技術&#xff0c;那么會協作得更好。 很多開發者認為&#xff0c;設計師應該學會如何編寫代碼&#xff0c;這一點是真的&#xff1a;通過學習&#xff0c;設計…

git 查看遠程倉庫地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 就一個命令&#xff1a; git remote -v 如下&#xff1a;

tensorflow之tf.train.exponential_decay()指數衰減法

exponential_decay(learning_rate, global_steps, decay_steps, decay_rate, staircaseFalse, nameNone) 使用方式&#xff1a; tf.tf.train.exponential_decay() 例子&#xff1a; tf.train.exponential_decay(self.config.e_lr, self.e_global_steps&#xff0c;self.config…

wait( )和 waitpid( )

進程一旦調用了wait&#xff0c;就立即阻塞自己&#xff0c;由wait自動分析是否當前進程的某個子進程已經退出&#xff0c;如果讓它找到了這樣一個已經變成僵尸的子進程&#xff0c;wait就會收集這個子進程的信息&#xff0c;并把它徹底銷毀后返回&#xff1b;如果沒有找到這樣…

享受閱讀的十二個好習慣

嚴謹的國際閱讀率比較研究顯示&#xff0c;當下韓國國民人均閱讀量約為每年11本&#xff0c;法國約為8.4本&#xff0c;日本在8.4—8.5本之間。全世界每年閱讀書籍數量排名第一的是猶太人&#xff0c;平均每人一年讀書64本。而中國13億人口&#xff0c;扣除教科書&#xff0c;平…

在 vscode 中使用 Git :拉取、提交、克隆

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;轉載此文后&#xff0c;網友在評論中提到還有其它方法&#xff0c;不過目前個人尚在研究中&#xff0c;有興趣的朋友們也可…

偶也要去上海Tech一把了

公司組織的&#xff0c;后天去&#xff0c;呵呵&#xff1a;&#xff09;希望能多認識一點博客園的兄弟姐妹轉載于:https://www.cnblogs.com/martinxj/archive/2004/09/14/42930.html

進程控制常用的一些操作

1、獲取進程的id int main0() {printf ("當前進程 ID %d\n", getpid());printf ("當前父進程&#xff1a;%d\n", getppid());printf ("當前用戶&#xff1a; %d\n", getuid());while (1);return 0; }2、fork 和 vfork之前的博客里有&#xf…

vscode 配置 git (配置、暫存、推送、拉取、免密)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 vscode 中對 git 進行了集成&#xff0c;很多操作只需點擊就能操作&#xff0c;無需寫一些 git 指令。 不過這就需要你對 vscode 進行配…

男女之間應該保留多少隱私

究竟&#xff0c;男女朋友之間&#xff0c;應該保留多少個人隱私? 我覺得&#xff0c;如果各自的隱私太多,那么&#xff0c;很難會相信彼此的愛能有多深濃。然而&#xff0c;如果兩個人沒有半點隱私,而且絕對坦誠。 彼此的行為和思想也沒有絲毫隱瞞的話,這種清白赤誠有如標…

處理bugs心法

1. 前提 第一層&#xff1a;遇到異常首先必須告訴自己&#xff0c;冷靜&#xff0c;不要慌。&#xff08;一看到Bug就心慌&#xff0c;那么武功就施展不了了&#xff09; 2. 入門級 第二層&#xff1a;遇到Bug&#xff0c;第一潛意識看輸出異常的信息的&#xff08;控制臺輸出&…

C語言實現簡單的電子通訊錄2

這兩天學完系統調用和標準IO&#xff0c;之前的通訊錄可以進行一些改進&#xff0c;將數據保存到文件中(圖我這里就不發了)。 原理&#xff1a;每次啟動程序時先從預設文件中以只讀的形式讀取保存的通訊錄信息&#xff0c;然后將讀取到的信息導入到結構體中&#xff1b;每次執…

解決 VS Code 保存時候自動格式化

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 不知道從哪個版本起&#xff0c;VS code 保存會自動格式化。 以前都是altshiftF格式化的&#xff0c;現在一保存就格式化&#xff0c;而…

發布在線文檔【軟件=業務+架構+流程+組織.pptx】

10年的技術工作&#xff0c;軟件這個詞對我來說一點都不陌生&#xff0c;但是當我問自己如何理解軟件的&#xff1f;我卻不知道如何回答。軟件&#xff1d;業務&#xff0b;架構&#xff0b;流程&#xff0b;組織&#xff0c;其中公式是借用軟件產品線工程BAPO的概念&#xff0…

12種食物最養男人 10種食物最養女人 太值得收藏了

據統計&#xff0c;男性10大死因中有4項與飲食有關&#xff0c;包括癌癥、腦血管疾病、心臟病和糖尿病。以下12種食品對男性健康有益&#xff0c;建議男性多多攝取。 男人需要的十種養生食物 No.1西紅柿 西紅柿的酸味能促進胃液分泌&#xff0c;幫助消化蛋白質等&#xff…

ES 基礎

1. ES 基礎一網打盡 1.1 ES定義 ESelaticsearch簡寫&#xff0c; Elasticsearch是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理PB級別的數據。 Elasticsear…

為什么 那么多 前端開發者都想學 Vue.js

根據JavaScript 2017 前端庫狀況調查 Vue.js是開發者最想學的前端庫。我在這里說明一下我為什么認為這也是和你一起通過使用 Vue 構建一個簡單的 App 應用程序的原因。 我最近曾與 Evan You&#xff0c;Chris Fritz&#xff0c;Sarah Drasner&#xff0c;和 Adam Jahr 做了一個…

進程間通信之管道通信

兩個程序之間傳遞數據的一種簡單方法是使用popen和pclose。 #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); popen函數允許一個程序將另一個程序作為新進程來啟動&#xff0c;并可以傳遞數據給它或者通過它接收數據…

vue 各組件 使用 Demo

環境搭建 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 假設你已經通讀vue官方文檔&#xff08;文檔都沒讀一遍&#xff08;至少&#xff09;&#xff0c;那不建議動手擼碼&#xff…

Dropbox推獨立應用,公司估值已達100億美元

摘要&#xff1a;Dropbox剛獲得5億美元的新一輪融資&#xff0c;其估值已高達100億美元&#xff0c;現在又推出針對云服務的獨立應用Carousel&#xff0c;不久之后&#xff0c;還會有應用陸續推出&#xff0c;隨著美國前國務卿賴斯的加盟&#xff0c;Dropbox在云市場的表現異常…