亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

守護進程的創建

2019-11-17 05:14:35
字體:
來源:轉載
供稿:網友

  1. 守護進程和普通進程的區別

守護進程在后臺運行, 與父進程的環境隔離, 這些環境包括
1.1 控制終端、會話組和進程組
1.2 工作目錄、文件創建掩碼
1.3 未關閉的文件描述符

察看常用的系統守護進程,看一下它們和進程組、控制終端和對話期有什么聯系。
ps –axj
父進程ID 進程ID 進程組ID 會話期ID 終端ID 終端進程組ID 狀態 用戶 運行時間 指令
PPID   PID  PGID   SID   TTY  TPGID    STAT UID TIME   COMMAND
0    1   0     0    ?   -1      S  0  0:04   init
1    2   1     1    ?   -1      SW  0  0:00   [keventd]
1    3   1     1    ?   -1      SW  0  0:00   [kapm-idled]
0    4   1     1    ?   -1      SWN 0  0:00   [ksoftirqd_CPU0]
0    5   1     1    ?   -1      SW  0  0:00   [kswapd]
0    6   1     1    ?   -1      SW  0  0:00   [kreclaimd]
0    7   1     1    ?   -1      SW  0  0:00   [bdflush]
0    8   1     1    ?   -1      SW  0  0:00   [kupdated]
1    9   1     1    ?   -1      SW< 0  0:00   [mdrecoveryd]
1    17   1     1    ?   -1      SW  0  0:02   [kjournald]
1    92   1     1    ?   -1      SW  0  0:00   [khubd]
1    573  573    573   ?   -1      S  0  0:03   syslogd -r -x
1    578  578    578   ?   -1      S  0  0:00   klogd -2
1    598  598    598   ?   -1      S  32  0:00   portmap

進程號為1、2的進程非凡,存在于系統的整個生命期中, 沒有父進程ID,沒有組進程ID,也沒有對話期ID。
syslogd
被任何記錄系統消息的程序使用, 可以在實際的控制臺上打印這些消息,也可將它們寫入文件。
sendmail
是標準郵遞守護進程。
updated
定期將內核緩存中的內容寫入硬盤(一般為每隔30秒), 實現手段是: 每隔30秒updated調用sync(2)函數。
cron
在指定的日期和時間執行指定的命令, 它定期地執行相關程序以實現許多系統治理任務。
inetd
監聽系統的網絡接口,以輸入對各種網絡服務器的請求。
lpd
處理對系統提出的打印請求。

注重,所有守護進程都以超級用戶(用戶ID為0)的優先權運行。沒有一個守護進程具有控制終端,終端名稱設置為問號(?)、終端前臺進程組ID設置為-1。 缺少控制終端是守護進程調用了setsid的結果。除update以外的所有守護進程都是進程組的和對話期的首進程,而且是這些進程組和對話期中的唯一進程。最后注重,所有這些守護進程的父進程都是init進程。

2. 在接觸實際編程前,我們來看看編寫守護進程要碰到的概念:進程組和會話期
2.1 進程組
每個進程有一個唯一的進程組ID。進程組ID類似于進程ID--它是一個正整數,并可存放在pid_t數據類型中。
每個進程組有一個組長進程。組長進程的標識是,其進程組ID等于其進程ID,進程組組長可以創建一個進程組,創建該組中的進程,然后終止,只要在某個進程組中有一個進程存在,則該進程組就存在,這與其組長進程是否終止無關。從進程組創建開始到其中最后一個進程離開為止的時間區間稱為進程組的生命期。某個進程組中的最后一個進程可以終止,也可以參加另一進程組。 進程調用setgid可以參加一個現存的組或者創建一個新進程組(setsid也可以創建一個新的進程組,后面將用到)。
2.2 會話期
會話期(session)是一個或多個進程組的集合。其中,在一個會話期中有3個進程組,通常是由shell的管道線將幾個進程編成一組的。

2.3 會話期和進程組的一些特性:
一個會話期可以有一個單獨的控制終端(controlling terminal),這一般是我們在其上登錄的終端設備(終端登錄)或偽終端設備(網絡登錄),但這個控制終端并不是必需的。
建立與控制終端連接的會話期首進程,被稱之為控制進程(contronlling PRocess)。一個會話期中的幾個進程組可被分為一個前臺進程組(foreground process group)以及一個或幾個后臺進程組(background process group)。

假如一個會話期有一個控制終端,則它有一個前臺進程組,其他進程組為后臺進程組。無論何時鍵入中斷鍵(通常是delete或ctrl-c)或退出鍵(通常是ctrl-),就會造成將中斷信號或退出信號送至前臺進程組的所有進程。

3. 守護進程的編程規則
3.1 脫離控制終端,登錄會話和進程組
登錄會話可以包含多個進程組,這些進程組共享一個控制終端,這個控制終端通常是創建進程的登錄終端??刂平K端,登錄會話和進程組通常是從父進程繼續下來的。我們的目的就是要擺脫它們,使之不受它們的影響。
其方法是在fork()的基礎上,調用setsid()使進程成為會話組長。調用成功后,進程成為新的會話組長和新的進程組長,并與原來的登錄會話和進程組脫離,由于會話過程對控制終端的獨占性,進程同時與控制終端脫離。
setsid()實現了以下效果:
(a) 成為新對話期的首進程
(b) 成為一個新進程組的首進程
(c) 沒有控制終端。

3.2 禁止進程重新打開控制終端
現在,進程已經成為無終端的會話組長,但它可以重新申請打開一個控制終端。可以通過使進程不再成為會話組長來禁止進程重新打開控制終端,再fork()一次。

3.3 關閉打開的文件描述符
進程從創建它的父進程那里繼續了打開的文件描述符。如不關閉,將會浪費系統資源,造成進程所在地文件系統無法卸下以及無法預料的錯誤。一般來說, 必要的是關閉0、1、2三個文件描述符,即標準輸入、標準輸出、標準錯誤。因為我們一般希望守護進程自己有一套信息輸出、輸入的體系,而不是把所有的東西都發送到終端屏幕上。
方法: close(文件描述符)。

3.4 改變當前工作目錄
將當前工作目錄更改為根目錄。從父進程繼續過來的當前工作目錄可能在一個裝配的文件系統中。因為守護進程通常在系統重啟之前是一直存在的,所以假如守護進程的當前工作目錄在一個裝配文件系統中,那么該文件系統就不能被拆卸。
另外,某些守護進程可能會把當前工作目錄更改到某個指定位置,在此位置做它們的工作。例如,行式打印機假脫機守護進程經常將其工作目錄更改到它們的spool目錄上。
方法: chdir("目錄");

3.5 重設文件創建掩碼
將文件方式創建屏蔽字設置為0:umask(0)。 由繼續得來的文件方式創建的屏蔽字可能會拒絕設置某些許可權。例如,若守護進程要創建一個組可讀、寫的文件,而繼續的文件方式創建屏蔽字,屏蔽了這兩種許可權,則所要求的組可讀、寫就不能起作用。

3.6 處理SIGCHLD信號
處理SIGCHLD信號并不是必須的。但對于某些進程, 非凡是服務器進程往往在請求到來時fork子進程出來處理請求。假如父進程不等待子進程結束,子進程將成為僵尸進程(zombie)而仍占用系統資源。假如父進程等待子進程結束,將增加父進程的負擔,影響服務器進程的并發性能。在系統V下可以簡單地將SIGCHLD信號的操作設為SIG_IGN:
signal(SIGCHLD,SIG_IGN);
這樣,內核在子進程結束時不會產生僵尸進程,這一點與BSD4不同,在BSD4下必須顯示等待子進程結束才能釋放僵尸進程。

4. 守護進程實例
守護進程實例包括兩部分:主程序test.c和初始化程序init.c。主程序每隔一分鐘向/tmp目錄中的日志test.log報告運行狀態。初始化程序中的init_daemon 函數負責生成守護進程

void init_daemon(void)
{
if(fork()!=0)
exit(0);
setsid();
if(fork()!=0)
exit(0);
for(int i=0; i<getdtablesize(); i++)
close(i);
chdir("/");
umask(0);
signal(SIGCHLD, SIG_IGN);
}

5. 守護進程的錯誤輸出
守護進程不屬于任何終端,所以當需要輸出某些信息時,它無法像一般程序那樣將信息直接輸出到標準輸出和標準錯誤輸出中。我們很大時候也不希望每個守護進程將它自己的出錯消息寫到一個單獨的文件中。因為對于系統治理人員而言,要記住哪一個守護進程寫到哪一個記錄文件中,并定期的檢查這些文件,他一定會為此感到頭疼的。所以,我們需要有一個集中的守護進程出錯記錄機制。目前很多系統都引入了syslog記錄進程來實現這一目的。
自伯克利開發了BSD syslog并廣泛應用以來,BSD syslog機制被大多數守護進程所使用。我們下面介紹BSD syslog的用法。有三種方法產生記錄消息:
1 內核例程可以調用log函數。任何一個用戶進程通過打開和讀/dev/klog設備就可以讀取這些消息。因為我們無意編寫內核中的例程,所以不再進一步說明此函數。
2 大多數用戶進程(守護進程)調用syslog函數以產生記錄消息。我們將在下面說明其調用序列。這使消息發送至Unix域數據報套接口/dev/log。
3 在此主機上,或通過TCP/ip網絡連接到此主機的某一其他主機上的一個用戶進程可將記錄消息發向UDP端口514。
注重: syslog函數并不產生這些UDP數據報——它們要求產生此記錄消息的進程具有顯式的網絡編程。
通常,syslog守護進程讀取三種格式的記錄消息。此守護進程在啟動時讀一個配置文件。一般來說,其文件名為/etc/syslog.conf,該文件決定了不同種類的消息應送向何處。例如,緊急消息可被送向系統治理員(若已登錄),并在控制臺上顯示,而警告消息則可記錄到一個文件中。該機制提供了syslog函數,其調用格式如下:

#include <syslog.h>
void openlog(char* ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();

調用openlog是可選擇的。假如不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用于與syslog守護進程通信的描述符。 調用openlog使我們可以指定一個ident,以后,此ident將被加至每則記錄消息中。ident一般是程序的名稱(例如,cron,inetd等)。option有4種可能:
LOG_CONS  若日志消息不能通過Unix域數據報發送至syslog,則將該消息寫至控制臺。
LOG_NDELAY1 立即打開Unix域數據報套接口至syslog守護進程,而不要等到記錄第一消息。通常,在記錄第一條消息之前,該套接口不打開。
LOG_PERROR 除將日志消息發送給syslog外,還將它發送至標準出錯。此選項僅由4.3BSD Reno及以后版本支持。
LOG_PID   每條消息都包含進程ID。此選項可供對每個請求都fork一個子進程的守護進程使用。
在openlog中設置facility參數的目的是讓配置文件可以說明, 來自不同設施的消息以不同的方式進行處理。假如不調用openlog,或者以facility為0來調用它,那么在調用syslog時,可將facility作為priority參數的一個部分進行說明。調用syslog產生一個記錄消息。其priority參數是facility和level的組合,它們可選取的值分別列于下面。level值按優先級從高級到最低按序排列。

上一篇:覆蓋GNU C庫

下一篇:C語言編程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩第一视频| 九九热在线精品视频| 国产精品日日摸夜夜添夜夜av| 在线观看欧美视频| 欧美视频中文字幕在线| 久久人人爽人人爽爽久久| 国产午夜一区二区| 欧美视频中文在线看| 亚洲欧美精品伊人久久| 成人亲热视频网站| 日韩精品在线视频观看| 色哟哟入口国产精品| 久久综合网hezyo| 久久影院在线观看| 久久精品美女视频网站| 在线亚洲国产精品网| 欧美人交a欧美精品| 国产精品海角社区在线观看| 欧美第一黄色网| 国内精品久久久久久久| 色爱av美腿丝袜综合粉嫩av| 成人黄色片在线| 日韩av综合中文字幕| 91欧美精品午夜性色福利在线| 午夜精品在线视频| 精品久久久久久中文字幕大豆网| 日本一区二区在线免费播放| 国产精品私拍pans大尺度在线| 国产一区二区三区视频| 日韩禁在线播放| 国产999在线| 欧美一级高清免费| 成人福利免费观看| 97国产一区二区精品久久呦| 91在线视频九色| 亚洲图片在区色| 国产91亚洲精品| 欧美国产高跟鞋裸体秀xxxhd| 国产欧美欧洲在线观看| 国内伊人久久久久久网站视频| 国产噜噜噜噜久久久久久久久| 国产日韩av高清| 隔壁老王国产在线精品| 久久亚洲国产精品| 亚洲精品91美女久久久久久久| 精品电影在线观看| 国产精品视频网址| 亚洲japanese制服美女| 欧美视频在线免费| 久久久www成人免费精品张筱雨| 91影院在线免费观看视频| 亚洲韩国日本中文字幕| 国产精品香蕉在线观看| 欧美一级淫片videoshd| 777午夜精品福利在线观看| 成人免费淫片aa视频免费| 欧美午夜女人视频在线| 久久6免费高清热精品| 亚洲第一精品夜夜躁人人躁| 亚洲精品天天看| 91精品国产网站| 精品亚洲一区二区三区四区五区| 国内精品久久久久伊人av| 不卡中文字幕av| 欧美日韩爱爱视频| 欧美一级黑人aaaaaaa做受| 成人午夜一级二级三级| 97av在线视频免费播放| 69av成年福利视频| 国产欧美最新羞羞视频在线观看| 欧美精品成人91久久久久久久| 中文字幕亚洲天堂| 日本精品免费一区二区三区| 伊人伊成久久人综合网小说| 国产精品小说在线| 日本欧美一二三区| 青青久久av北条麻妃海外网| 亚洲激情自拍图| 国产精品中文字幕在线| 午夜剧场成人观在线视频免费观看| 亚洲欧洲免费视频| 日韩电影视频免费| 午夜精品久久久久久久久久久久久| 国产日韩欧美在线| 91在线色戒在线| 91精品国产自产91精品| 26uuu另类亚洲欧美日本老年| 久久精品国产电影| 欧美激情在线视频二区| 久久久最新网址| 欧美亚洲激情视频| 欧洲美女7788成人免费视频| 中文字幕久久久av一区| 亚洲最大中文字幕| 国产999在线观看| 精品久久久香蕉免费精品视频| 日韩中文综合网| 亚洲一区二区三区四区在线播放| 亚洲天天在线日亚洲洲精| 视频直播国产精品| 8x海外华人永久免费日韩内陆视频| 亚洲一区二区日本| 91中文字幕在线| 亚洲天堂久久av| 欧美国产日韩一区二区在线观看| 亚洲第一中文字幕在线观看| 最新国产精品拍自在线播放| 亚洲欧美激情在线视频| 久久久久久亚洲精品不卡| 日韩国产欧美精品在线| 精品人伦一区二区三区蜜桃免费| 精品国产91乱高清在线观看| 久久精品一区中文字幕| 中文在线资源观看视频网站免费不卡| 久久这里只有精品99| 黑人精品xxx一区| 国产在线观看精品一区二区三区| 国产精品美女久久| 91精品国产91久久久久| 精品国产一区二区三区在线观看| 日韩极品精品视频免费观看| 亚洲尤物视频网| 国产精品美女久久久久av超清| 欧美精品在线播放| 国产精品久久久久久久久久尿| 国产一区红桃视频| 久久99视频免费| 日韩av电影国产| 富二代精品短视频| 国产成人精品视频在线| 久久青草精品视频免费观看| 日韩最新av在线| 久久久免费精品视频| 91久久精品国产91久久| 国产精品久久久久久久7电影| 91在线高清免费观看| 日韩在线视频线视频免费网站| 亚洲国产精品久久久久秋霞不卡| 欧美日韩国产精品一区二区三区四区| 欧美乱妇40p| 久久综合色影院| 亚洲精品suv精品一区二区| 91深夜福利视频| 亚洲3p在线观看| 在线视频精品一| 懂色av影视一区二区三区| 一本大道亚洲视频| 日韩av综合网| 久久99国产综合精品女同| 亚洲国产欧美精品| 色综合亚洲精品激情狠狠| 久久久久久久一区二区| 亚洲综合成人婷婷小说| 欧美高清视频在线播放| 亚洲自拍偷拍区| 欧美日韩一区二区三区| 亚洲欧洲黄色网| 久久精品久久久久| 精品视频在线观看日韩| 成人乱色短篇合集| 日韩精品福利在线| 国产精品成人va在线观看| 九九热精品在线| 欧美性猛交xxxx乱大交|