守護(hù)進(jìn)程是運(yùn)行在后臺的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程是一種很有用的進(jìn)程,Linux的大多服務(wù)器就是用守護(hù)進(jìn)程實(shí)現(xiàn)的。
郊區(qū)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
守護(hù)進(jìn)程的創(chuàng)建步驟:
1.使進(jìn)程在后臺運(yùn)行(創(chuàng)建子進(jìn)程,父進(jìn)程退出)
if((pid=fork())>0)
exit(0);
else if (pid<0)
{
perror("fail to fork");
exit(-1);
}
2.脫離控制終端,登錄會話和進(jìn)程組(創(chuàng)建新會話)
進(jìn)程屬于一個進(jìn)程組,進(jìn)程組號進(jìn)程組長的進(jìn)程號。一個會話可以包含多個進(jìn)程組,這些進(jìn)程組共享一個控制終端,這個控制終端通常是創(chuàng)建進(jìn)程的登錄終端??刂平K端,會話和進(jìn)程組通常是從父進(jìn)程繼承下來的。我們的目的就是要擺脫他們,使之不受他們的影響。方法是在第一點(diǎn)的基礎(chǔ)上,調(diào)用setsid()使進(jìn)程成為會話組長:
setsid();
說明:當(dāng)進(jìn)程是會話組長時setsid()調(diào)用失敗。但第一點(diǎn)已經(jīng)保證進(jìn)程不是會話組長。setsid()調(diào)用成功后,進(jìn)程成為新的會話組長和新的進(jìn)程組長,并與原來的登錄會話和進(jìn)程組脫離。由于會話過程對進(jìn)程的獨(dú)占性,進(jìn)程同時與控制終端脫離。
3.禁止進(jìn)程重新打開控制終端
現(xiàn)在進(jìn)程已成為無終端的會話組長,但它可以重新申請打開一個控制終端。可以通過使進(jìn)程不在成為會話組長來禁止進(jìn)程從新打開控制終端:
if(pid=fork())
exit(0); //結(jié)束第一子進(jìn)程,第二子進(jìn)程不在是會話組長
4.關(guān)閉所有文件描述符
進(jìn)程從創(chuàng)建它的父進(jìn)程那里繼承了打開的文件描述符。如不關(guān)閉,將會浪費(fèi)系統(tǒng)資源,以及無法預(yù)料的錯誤。
close(0);
close(1);
close(2);
5.改變當(dāng)前工作目錄:
進(jìn)程活動時,其工作目錄所在的文件系統(tǒng)不能卸下。一般需要將工作目錄改變到根目錄。
chdir("\");
6.重設(shè)權(quán)限掩碼:
進(jìn)程從創(chuàng)建它的父進(jìn)程那里繼承了文件創(chuàng)建掩碼。它可能修改守護(hù)進(jìn)程所創(chuàng)建的文件的存取位。為防止這一點(diǎn),我們要將文件創(chuàng)建掩碼清除:
umask(0);
7.處理SIGCHLD信號:
處理SIGCHLD信號并不是必須的。但對于某些進(jìn)程,特別是服務(wù)器進(jìn)程往往在請求到來時生成子進(jìn)程處理請求。如果父進(jìn)程不等待子進(jìn)程結(jié)束,子進(jìn)程將成為僵尸進(jìn)程,從而占用系統(tǒng)資源。如果父進(jìn)程等待子進(jìn)程的結(jié)束,將增加父進(jìn)程的負(fù)擔(dān),影響服務(wù)器進(jìn)程的并發(fā)性能。
signal(SIGCHLD,SIG_IGN);
下面我們來看具體的代碼:(模擬實(shí)現(xiàn)簡單的守護(hù)進(jìn)程)
my_daemon.c文件
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void my_daemon()
{
umask(0);
pid_t id1=fork();
if(id1<0)
{
perror("fork");
exit(1);
}
if(id1>0)
{
exit(0);
}
setsid();
pid_t id2=fork();
if(id2<0)
{
perror("fork");
exit(1);
}
if(id2>0)
{
exit(0);
}
signal(SIGCHLD,SIG_IGN);
chdir("/");
close(0);
close(1);
close(2);
}
int main()
{
my_daemon();
while(1)
{}
return 0;
}
運(yùn)行結(jié)果結(jié)果如下:
我們可以看到有個進(jìn)程號為1的進(jìn)程,證明我們生成了守護(hù)進(jìn)程。
下面是一個相對而言比較完整的守護(hù)進(jìn)程,這個守護(hù)進(jìn)程每隔一定時間向daemon.log文件輸出時間信息:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
void my_daemon()
{
umask(0);
pid_t id1=fork();
if(id1<0)
{
perror("fork");
exit(1);
}
if(id1>0)
{
exit(0);
}
setsid();
pid_t id2=fork();
if(id2<0)
{
perror("fork");
exit(1);
}
if(id2>0)
{
exit(0);
}
signal(SIGCHLD,SIG_IGN);
chdir("/");
close(0);
close(1);
close(2);
}
int main()
{
FILE* fp;
time_t t;
fp=fopen("daemon.log","a");
char *buf="hello bit";
my_daemon();
while(1)
while(1)
{
sleep(1);
t=time(0);
fprintf(fp,"this is a daemon: %s",asctime(localtime(&t)));
}
fclose(fp);
return 0;
}
標(biāo)題名稱:守護(hù)進(jìn)程的創(chuàng)建方法與步驟
文章路徑:http://www.rwnh.cn/article44/ipciee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、微信小程序、品牌網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、網(wǎng)站制作、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)