麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

守護進程的創建

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 脫離控制終端,登錄會話和進程組
登錄會話可以包含多個進程組,這些進程組共享一個控制終端,這個控制終端通常是創建進程的登錄終端。控制終端,登錄會話和進程組通常是從父進程繼續下來的。我們的目的就是要擺脫它們,使之不受它們的影響。
其方法是在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精品国产综合久久久欧美 | 国产精选电影免费在线观看网站 | 凹凸成人精品亚洲精品密奴 | 97超级碰碰人国产在线观看 | 欧美成年人在线视频 | 亚洲骚综合 | www.99热精品 | 国产精品二区高清在线 | 国产一级二级在线播放 | 国产在线中文 | 一区二区三区在线播放视频 | 欧美人与zoxxxx另类9 | 欧美一级不卡视频 | 麻豆视频在线观看 | 午夜视频久久 | 国产成人精品午夜 | 日本a在线观看 | 香蕉久久久 | 久久人体 | 有色视频在线观看 | 202z中文字幕第一页 | 精品久久中文字幕 | 欧美成人免费一级 | 羞羞的视频在线 | 国产亚洲美女精品久久久2020 | 成人福利免费在线观看 | 4399一级成人毛片 | 亚洲啪| 欧美精品在线视频观看 | 一区二区免费网站 | 99爱视频| 成人午夜影院 | 99久久婷婷国产综合精品青牛牛 | 久久亚洲视频网 | 黄网站在线播放视频免费观看 |