目錄
一.進(jìn)程組和會話
二.守護(hù)進(jìn)程的概念
三.守護(hù)線程的特點
四.守護(hù)進(jìn)程創(chuàng)建的基本步驟
一.進(jìn)程組和會話
1.進(jìn)程組的相關(guān)概念:
進(jìn)程除了有進(jìn)程的PID之外還有一個進(jìn)程組,進(jìn)程組是由一個進(jìn)程或者多個進(jìn)程組成。通常他們與同一作業(yè)相關(guān)聯(lián)可以收到同一終端的信號
每個進(jìn)程組有唯一的進(jìn)程組ID,每個進(jìn)程組有一個進(jìn)程組組長。如何判斷一個進(jìn)程是不是這個進(jìn)程組的組長了,通常進(jìn)程組ID等于進(jìn)程ID那么這個進(jìn)程就是對應(yīng)進(jìn)程組的組長。
2.會話的相關(guān)概念
會話是有一個或者多個進(jìn)程組組成的集合
一個會話可以有一個終端,建立與控制終端連接的會話首進(jìn)程被成為控制進(jìn)程,一個會話的幾個進(jìn)程組可以分為前臺進(jìn)程和后臺進(jìn)程,而這些進(jìn)程組的控制終端相同也就是sesion id是一樣的當(dāng)用戶使用ctr +c 產(chǎn)生SIGINT信號時內(nèi)核會發(fā)送信號給相應(yīng)前臺進(jìn)程組的所有進(jìn)程如果我運(yùn)行一個程序我們想要把他放到后臺運(yùn)行我們可以在可執(zhí)行程序的后面加一個& 舉個列子:./test & 如果我們想要把他提到前臺進(jìn)程我們可以使用fg
二.守護(hù)進(jìn)程的概念
守護(hù)進(jìn)程也叫做精靈進(jìn)程,是運(yùn)行在后臺的一種特殊進(jìn)程他獨立于控制終端并且可以周期性的執(zhí)行某種任務(wù)或者等待處理某些發(fā)生的事件。
守護(hù)進(jìn)程是非常有用的進(jìn)程,在Linux當(dāng)中大多數(shù)服務(wù)器用的就是守護(hù)進(jìn)程比如Web服務(wù)器httpd等,同時守護(hù)進(jìn)程完成很多系統(tǒng)的任務(wù)。當(dāng)Linux系統(tǒng)啟動的時候,會啟動很多系統(tǒng)服務(wù),這些進(jìn)程服務(wù)是沒有終端的也就是說你把終端關(guān)閉了這些系統(tǒng)服務(wù)是不會停止的,他們一直運(yùn)行著他們有一個名字就叫做守護(hù)進(jìn)程。
我們可以使用ps ajx來查看系統(tǒng)中的進(jìn)程
參數(shù)說明:
- a代表不僅列出當(dāng)前用戶的進(jìn)程并且其他用戶的進(jìn)程也會被列出
- 參數(shù)x表示不僅列出所有控制終端的進(jìn)程也列出所有無控制終端的進(jìn)程
- 參數(shù)j表示列出也作業(yè)控制相關(guān)的進(jìn)程
下面我們使用ps axj來查看系統(tǒng)中的守護(hù)進(jìn)程
?其中TTY為?號的都表示這個進(jìn)程和終端沒有關(guān)系。
三.守護(hù)線程的特點
守護(hù)進(jìn)程是一種長期運(yùn)行的進(jìn)程,這種進(jìn)程在后臺運(yùn)行并且不根任何控制終端關(guān)聯(lián)其主要特點如下:
生存周期長[不是必須]:一般是操作系統(tǒng)啟動的時候他啟動,操作系統(tǒng)關(guān)閉的時候他也關(guān)閉
守護(hù)進(jìn)程和終端沒有關(guān)聯(lián),也就是說他們沒有控制終端,所以你控制終端退出也不會導(dǎo)致守護(hù)進(jìn)程退出
守護(hù)進(jìn)程是在后臺運(yùn)行不會占著終端,終端可以執(zhí)行其它命令
linux操作系統(tǒng)本來就有很多的守護(hù)進(jìn)程默默運(yùn)行,維持系統(tǒng)的正常活動大概有30到50個,?ps -efj ppid為0的進(jìn)程為內(nèi)核進(jìn)程,跟隨系統(tǒng)啟動聲明周期是隨內(nèi)核的,cmd列帶[]的這種叫內(nèi)核守護(hù)進(jìn)程,老主init也是守護(hù)進(jìn)程負(fù)責(zé)啟動各運(yùn)行層次特定的系統(tǒng)服務(wù),所以很多進(jìn)程的ppid是init.并且這個init進(jìn)程也負(fù)責(zé)收養(yǎng)孤兒進(jìn)程,cmd列不帶[]我們稱為普通守護(hù)進(jìn)程,也叫做用戶守護(hù)進(jìn)程。
四.守護(hù)進(jìn)程創(chuàng)建的基本步驟
1.設(shè)置權(quán)限掩碼,調(diào)用umask(0)權(quán)限掩碼不會對文件的權(quán)限有太多的影響
2.父進(jìn)程創(chuàng)建子進(jìn)程,fork一個子進(jìn)程(脫離終端)出來然后父進(jìn)程退出(把終端空出來不讓中端卡住):固定套路。其中fork()的目的是想調(diào)用setsid()來建立新會話目的是子進(jìn)程有單獨的sid,而且子進(jìn)程也成為了一個新進(jìn)程組的組長,同時子進(jìn)程不關(guān)聯(lián)任何終端。(注意:調(diào)用setsid建立新會話的進(jìn)程不能是進(jìn)程組的組長)
3.由于守護(hù)進(jìn)程和終端沒有關(guān)系所以我們需要將子進(jìn)程的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出重定向到dev/null(空設(shè)備當(dāng)中去)所以我們可以使用open函數(shù)打開這個空設(shè)備文件將子進(jìn)程的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出重定向到這個空設(shè)備對應(yīng)的文件當(dāng)中(黑洞確保守護(hù)進(jìn)程不從鍵盤接收任何東西也把任何東西打印到屏幕上)
下面我們來看看創(chuàng)建守護(hù)進(jìn)程的代碼:
#include <iostream> #include <unistd.h> #include <signal.h> #include<sys/stat.h> #include<cstdlib> #include<fcntl.h> //創(chuàng)建守護(hù)進(jìn)程 int ngx_daemon() { int fd; switch (fork())//創(chuàng)建子進(jìn)程 { case -1: //創(chuàng)建子進(jìn)程失敗這里可以寫日志 return -1; case 0: //子進(jìn)程走到這里直接break即可 break; default: exit(0); //父進(jìn)程退出 break; } //只有子進(jìn)程才會走到這里 if(setsid()==-1) { //記錄錯誤日志 return -1; } umask(0);//設(shè)置權(quán)限掩碼 fd=open("/dev/null",O_RDWR);//打開黑洞設(shè)備以讀寫方式打開 if(fd==-1) { //記錄錯誤日志 return -1; } if(dup2(fd,0)==-1)//進(jìn)行重定向 { //記錄錯誤日志 return -1; } if(dup2(fd,1)==-1) { //記錄錯誤日志 return -1; } if(fd>3) { if(close(fd)==-1) { //記錄錯誤日志 return -1; } } return 1; } int main(int argc, char *argv[]) { if(ngx_daemon()!=1) { //創(chuàng)建守護(hù)進(jìn)程失敗可以做失敗后的處理比如寫日志等等 return 1; } else { //創(chuàng)建守護(hù)進(jìn)程成功執(zhí)行守護(hù)進(jìn)程要干的活 for(;;) { sleep(1); //打印了也沒有用因為子進(jìn)程已經(jīng)重定向了,不會打印任何結(jié)果到標(biāo)準(zhǔn)輸出上 printf("休息一秒,進(jìn)程id=%d!\n",getpid()); } } return 0; }
總結(jié):
1.守護(hù)進(jìn)程不會收到的信號SIGHUP:終端斷開信號守護(hù)進(jìn)程不會收到內(nèi)核SIGHUP信號,如果收到了SIGHUP信號那么肯定是另外的進(jìn)程發(fā)送給你的,很多守護(hù)進(jìn)程把這個信號做為通知信號,表示配置文件已經(jīng)發(fā)生改變守護(hù)應(yīng)該重新讀入其配置文件,同時也不會收到內(nèi)核的SIGINT和SIGWINCH信號。
2.守護(hù)進(jìn)程和后臺進(jìn)程的區(qū)別:
守護(hù)進(jìn)程和終端沒有關(guān)系但是后臺進(jìn)程能往終端上輸出東西和終端有關(guān)聯(lián)文章來源:http://www.zghlxwxcb.cn/news/detail-475823.html
守護(hù)進(jìn)程關(guān)閉終端時不受影響而,后臺進(jìn)程會隨著終端的退出而退出文章來源地址http://www.zghlxwxcb.cn/news/detail-475823.html
到了這里,關(guān)于守護(hù)進(jìn)程(初學(xué)者必備)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!