目錄
前言
1.如何理解前臺(tái)進(jìn)程和后臺(tái)進(jìn)程
2.守護(hù)進(jìn)程的概念
3.為什么會(huì)存在守護(hù)進(jìn)程
4.如何實(shí)現(xiàn)守護(hù)進(jìn)程
5.測(cè)試
總結(jié)
前言
? ? ? ? 今天我們要介紹的是關(guān)于守護(hù)進(jìn)程如何實(shí)現(xiàn),可能有小伙伴第一次聽到守護(hù)進(jìn)程這個(gè)概念,感覺很懵,知道進(jìn)程的概念,但是不知道守護(hù)進(jìn)程是什么,它是否和進(jìn)程有關(guān)聯(lián),以及守護(hù)進(jìn)程有什么意義,帶著這些疑問,下面,我們就一起來慢慢揭曉這些答案,相信看完這篇文章之后,關(guān)于守護(hù)進(jìn)程的話題,你將會(huì)有一個(gè)清晰的認(rèn)識(shí)。
1.如何理解前臺(tái)進(jìn)程和后臺(tái)進(jìn)程
如圖所示:
?jobs:查看后臺(tái)進(jìn)程
例:
[myl@VM-8-12-centos tcp]$ sleep 1000&
[1] 5492
[myl@VM-8-12-centos tcp]$ sleep 1000 | sleep 2000 &
[2] 6514
[myl@VM-8-12-centos tcp]$ jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 1000 | sleep 2000 &
?說明:&表示將該進(jìn)程設(shè)置為后臺(tái)進(jìn)程運(yùn)行,jobs查看后臺(tái)進(jìn)程,前面的數(shù)字代表作業(yè)編號(hào)
PGID:代表同一個(gè)進(jìn)程組,一般將一個(gè)進(jìn)程組中的第一個(gè)稱為是組長,多個(gè)進(jìn)程共同完成一個(gè)作業(yè)
SID:代表會(huì)話ID,不同進(jìn)程組會(huì)話ID相同,代表屬于同一個(gè)會(huì)話
fg + 作業(yè)編號(hào):代表將該進(jìn)程設(shè)置為前臺(tái)進(jìn)程
ctrl + Z:暫停該進(jìn)程,并放到后臺(tái)
bg + 作業(yè)編號(hào),啟動(dòng)該進(jìn)程
[myl@VM-8-12-centos tcp]$ jobs
[1]- ?Running ? ? ? ? ? ? ? ? sleep 1000 &
[2]+ ?Running ? ? ? ? ? ? ? ? sleep 1000 | sleep 2000 &
[myl@VM-8-12-centos tcp]$ fg 2
sleep 1000 | sleep 2000
ls
pwd ?
^Z[1] ? Done ? ? ? ? ? ? ? ? ? ?sleep 1000
[2]+ ?Stopped ? ? ? ? ? ? ? ? sleep 1000 | sleep 2000
[myl@VM-8-12-centos tcp]$ jobs
[2]+ ?Stopped ? ? ? ? ? ? ? ? sleep 1000 | sleep 2000
[myl@VM-8-12-centos tcp]$ bg 2
[2]+ sleep 1000 | sleep 2000 &
[myl@VM-8-12-centos tcp]$ jobs
[2]+ ?Running ? ? ? ? ? ? ? ? sleep 1000 | sleep 2000 &
所以作業(yè)是可以前后臺(tái)進(jìn)行切換的。
當(dāng)客戶端退出的時(shí)候,之前的進(jìn)程也就退出了,包括前臺(tái)進(jìn)程和后臺(tái)進(jìn)程
2.守護(hù)進(jìn)程的概念
? ? ? ?上面我們介紹了前臺(tái)進(jìn)程和后臺(tái)進(jìn)程,前臺(tái)進(jìn)程只能有一個(gè),而后臺(tái)進(jìn)程可以有多個(gè),可以互相切換,都屬于同一個(gè)會(huì)話,共同特點(diǎn)就是當(dāng)客戶端退出之后不管是前臺(tái)進(jìn)程還是后臺(tái)進(jìn)程,都會(huì)退出,而我們今天要介紹的守護(hù)進(jìn)程是自成會(huì)話,自成進(jìn)程組和終端設(shè)備無關(guān),除非使用kill命令終止該進(jìn)程,否則將一直運(yùn)行,將這種進(jìn)程被稱為是守護(hù)進(jìn)程。
3.為什么會(huì)存在守護(hù)進(jìn)程
? ? ? ? 當(dāng)實(shí)現(xiàn)了一款服務(wù)器,服務(wù)器啟動(dòng)之后對(duì)外提供服務(wù),不能因?yàn)榭蛻舳送顺?,而服?wù)進(jìn)程也跟著退出了,所以一般將服務(wù)進(jìn)程會(huì)設(shè)置為守護(hù)進(jìn)程,一直對(duì)外提供服務(wù)。
4.如何實(shí)現(xiàn)守護(hù)進(jìn)程
setsid()函數(shù):生成一個(gè)會(huì)話ID,自成一個(gè)會(huì)話
#include <unistd.h>
pid_t setsid(void);
使用說明:調(diào)用該函數(shù)的進(jìn)程不能是進(jìn)程組的組長
實(shí)現(xiàn)代碼:
#pragma once
#include<signal.h>
#include<unistd.h>
#include<cstdlib>
#include<cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEV "/dev/null"
void daemonSelf(const char* curPath = nullptr)
{
//1.讓調(diào)用進(jìn)程忽略掉異常的信號(hào)
signal(SIGPIPE,SIG_IGN);
//2.讓自己變成守護(hù)進(jìn)程的前提:以非組長的身份調(diào)用setsid
if(fork() > 0)
exit(0);
//子進(jìn)程 --- 守護(hù)進(jìn)程,精靈進(jìn)程,本質(zhì)是孤兒進(jìn)程的一種
pid_t n = setsid();
assert(n != -1);
//3.守護(hù)進(jìn)程默認(rèn)是脫離終端的,關(guān)閉或者重定向以前進(jìn)程默認(rèn)打開的文件:
//dev/null文件的特點(diǎn):向該文件中寫入內(nèi)容,會(huì)自動(dòng)清空
int fd = open(DEV,O_RDWR);
if(fd >= 0)
{
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
}
else
{
close(0);
close(1);
close(2);
}
//4.可選,進(jìn)程執(zhí)行路勁發(fā)生更改:
if(curPath)
chdir(curPath);
}
此時(shí)就可以在服務(wù)器初始化完成,啟動(dòng)之前將該進(jìn)程設(shè)置為服務(wù)進(jìn)程,至此該進(jìn)程就不會(huì)再退出
5.測(cè)試
運(yùn)行截圖:
此時(shí)通過圖片觀察到,當(dāng)服務(wù)器啟動(dòng)之后,不再像之前那樣變?yōu)榍芭_(tái)進(jìn)程,而是自成會(huì)話作為后臺(tái)進(jìn)程,被其它客戶端訪問。文章來源:http://www.zghlxwxcb.cn/news/detail-669878.html
總結(jié)
? ? ? ? 相信看完之后,大家對(duì)守護(hù)進(jìn)程是什么就非常熟悉了,今天關(guān)于守護(hù)進(jìn)程的介紹就到這里了,感謝大家的閱讀,我們下次再見。文章來源地址http://www.zghlxwxcb.cn/news/detail-669878.html
到了這里,關(guān)于守護(hù)進(jìn)程(精靈進(jìn)程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!