




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第08章 守護(hù)進(jìn)程和inetd超級服務(wù)器守護(hù)進(jìn)程概述n守護(hù)進(jìn)程是在后臺運(yùn)行不受終端控制的進(jìn)程(如輸入、輸出等),一般的網(wǎng)絡(luò)服務(wù)都是以守護(hù)進(jìn)程的方式運(yùn)行。n守護(hù)進(jìn)程脫離終端的主要原因有兩點(diǎn):n用來啟動(dòng)守護(hù)進(jìn)程的終端在啟動(dòng)守護(hù)進(jìn)程之后,需要執(zhí)行其他任務(wù)。(如其他用戶登錄該終端后,以前的守護(hù)進(jìn)程的錯(cuò)誤信息不應(yīng)出現(xiàn))n由終端上的一些鍵所產(chǎn)生的信號(如中斷信號),不應(yīng)對以前從該終端上啟動(dòng)的任何守護(hù)進(jìn)程造成影響。n要注意守護(hù)進(jìn)程與后臺運(yùn)行程序(即加啟動(dòng)的程序)的區(qū)別。啟動(dòng)守護(hù)進(jìn)程的方法n在系統(tǒng)啟動(dòng)時(shí)由系統(tǒng)初始化腳本啟動(dòng),這些腳本一般在/etc或etc/rc開頭的目錄。如inet超級服務(wù)器,web服務(wù)器等;
2、n許多網(wǎng)絡(luò)服務(wù)器是由inet超級服務(wù)器啟動(dòng)的,如Telnetd、FTP等;ncron守護(hù)進(jìn)程按一定的規(guī)則執(zhí)行一些程序,由它啟動(dòng)的程序也以守護(hù)進(jìn)程的方式運(yùn)行。n守護(hù)進(jìn)程可以在用戶終端上啟動(dòng),這是測試守護(hù)進(jìn)程或重新啟動(dòng)守護(hù)進(jìn)程常用的方法。登記出錯(cuò)信息 由于守護(hù)進(jìn)程沒有控制終端,在發(fā)生由于守護(hù)進(jìn)程沒有控制終端,在發(fā)生問題時(shí)它要用一些其它方式以輸出消息。問題時(shí)它要用一些其它方式以輸出消息。 可以通過向文件里寫數(shù)據(jù)來輸出消息,可以通過向文件里寫數(shù)據(jù)來輸出消息,但這樣不好管理。(因?yàn)槊恳粋€(gè)守護(hù)進(jìn)程但這樣不好管理。(因?yàn)槊恳粋€(gè)守護(hù)進(jìn)程要對應(yīng)一個(gè)文件)。要對應(yīng)一個(gè)文件)。一般用一般用syslogd守護(hù)進(jìn)程來登
3、記出錯(cuò)信息。守護(hù)進(jìn)程來登記出錯(cuò)信息。用戶守護(hù)進(jìn)程登記出錯(cuò)信息n創(chuàng)建一個(gè)創(chuàng)建一個(gè)Unix域數(shù)據(jù)報(bào)套接口,并向域數(shù)據(jù)報(bào)套接口,并向syslogd守護(hù)進(jìn)程綁定的路徑名發(fā)送我們的消息,我們就守護(hù)進(jìn)程綁定的路徑名發(fā)送我們的消息,我們就能從自己的守護(hù)進(jìn)程向能從自己的守護(hù)進(jìn)程向syslogd發(fā)送登記信息。發(fā)送登記信息。n可以創(chuàng)建一個(gè)可以創(chuàng)建一個(gè)UDP套接口,將日志消息發(fā)到回套接口,將日志消息發(fā)到回饋地址及端口號饋地址及端口號514(syslog服務(wù)使用的端口服務(wù)使用的端口號號);n更簡單的方法是利用更簡單的方法是利用syslog函數(shù)。函數(shù)。syslog函數(shù)函數(shù)是輸出這些消息的標(biāo)準(zhǔn)方式,它將消息發(fā)往是輸出這些
4、消息的標(biāo)準(zhǔn)方式,它將消息發(fā)往syslogd守護(hù)進(jìn)程。守護(hù)進(jìn)程。syslogd守護(hù)進(jìn)程nsyslogd是一個(gè)系統(tǒng)守護(hù)進(jìn)程,它主要負(fù)責(zé)接收系統(tǒng)或用戶守護(hù)進(jìn)程是一個(gè)系統(tǒng)守護(hù)進(jìn)程,它主要負(fù)責(zé)接收系統(tǒng)或用戶守護(hù)進(jìn)程的輸出消息,并根據(jù)配置信息作出相應(yīng)處理。的輸出消息,并根據(jù)配置信息作出相應(yīng)處理。nsyslogd在啟動(dòng)時(shí)執(zhí)行以下操作:在啟動(dòng)時(shí)執(zhí)行以下操作:1、讀入配置文件,通常是、讀入配置文件,通常是/etc/syslogd.conf,它設(shè)定守護(hù)進(jìn)程,它設(shè)定守護(hù)進(jìn)程對接收的各種登記消息如何處理。這些消息可能被寫入一個(gè)文件對接收的各種登記消息如何處理。這些消息可能被寫入一個(gè)文件(一種特殊文件是(一種特殊文件是
5、/dev/console,這將把消息寫到控制臺上)。,這將把消息寫到控制臺上)?;虬l(fā)給指定的用戶,或轉(zhuǎn)發(fā)給另一臺主機(jī)上的或發(fā)給指定的用戶,或轉(zhuǎn)發(fā)給另一臺主機(jī)上的syslogd進(jìn)程。進(jìn)程。2、創(chuàng)建一個(gè)、創(chuàng)建一個(gè)Unix域套接字,給它捆綁路徑名域套接字,給它捆綁路徑名/var/run/log3、創(chuàng)建一個(gè)、創(chuàng)建一個(gè)udp套接字,給它捆綁端口套接字,給它捆綁端口5144、打開路徑名、打開路徑名/dev/klog,內(nèi)核中的所有出錯(cuò)消息作為這個(gè)設(shè)備,內(nèi)核中的所有出錯(cuò)消息作為這個(gè)設(shè)備的輸入出現(xiàn);的輸入出現(xiàn);n在此之后在此之后syslogd進(jìn)程運(yùn)行一個(gè)無限循環(huán),循環(huán)中調(diào)用進(jìn)程運(yùn)行一個(gè)無限循環(huán),循環(huán)中調(diào)用sel
6、ect,等待等待三個(gè)描述字(以上三個(gè)描述字(以上2、3、4創(chuàng)建)之一變?yōu)榭勺x,并按配置文件對消創(chuàng)建)之一變?yōu)榭勺x,并按配置文件對消息進(jìn)行處理息進(jìn)行處理openlog函數(shù)void openlog(const char *ident, int option, int facility);void closelog(void);nopenlog函數(shù)在第一次調(diào)用syslog函數(shù)之前調(diào)用,當(dāng)不再需要發(fā)生登記消息時(shí)可調(diào)用closelog函數(shù);nident是一個(gè)字符串,它將被加到每條登記消息前面;option參數(shù)由下頁圖中的值組合而成。facility參數(shù)為后面沒有設(shè)置設(shè)施的syslog調(diào)用設(shè)置一個(gè)缺省值。
7、openlog的選項(xiàng)選項(xiàng)(選項(xiàng)(options)描述描述LOG_CONS如果不能發(fā)往syslogd守護(hù)進(jìn)程,則登記到控制臺上LOG_NDELAY不延遲打開,立即創(chuàng)建套接口LOG_PERROR既發(fā)往syslogd守護(hù)進(jìn)程,又登記到標(biāo)準(zhǔn)錯(cuò)誤輸出LOG_PID登記每條消息的進(jìn)程IDsyslog函數(shù)#include void syslog(int priority, const char * message,);n參數(shù)message與printf所用的格式化字符串類似,同時(shí)增加了%m,它將由對應(yīng)的當(dāng)前errno值的出錯(cuò)消息所取代;n參數(shù)priority是級別(level)和設(shè)施(facility)的組
8、合。設(shè)施和級別的目的是,允許在/etc/syslog.conf文件中進(jìn)行配置,使得對相同設(shè)施的消息得到同樣的處理,或使相同級別的消息得到同樣的處理。syslog函數(shù)的例子n當(dāng)調(diào)用rename函數(shù)失敗時(shí),守護(hù)進(jìn)程可能會(huì)調(diào)用: if (rename(file1, file2) = -1) syslog(LOG_INFO|LOG_LOCAL2,”rename(%s,%s):%m”,file1,file2);n如果配置文件中有以下兩行: kern */dev/console local2.debug/var/log//var/log/info.log 則指定內(nèi)核
9、的所有消息登記到控制臺上,所有設(shè)施為local2的調(diào)試消息將添加到/var/log/cisco文件的末尾;一個(gè)簡單例子(syslog.c)#include #include int main()openlog(here,LOG_PID,LOG_USER);syslog(LOG_INFO|LOG_LOCAL4,local4);closelog();printf(okn);注意:如果syslog.conf文件中增加了新行,須重新啟動(dòng)syslog服務(wù)。test.log文件中的數(shù)據(jù)setsid()函數(shù)#include #include pid_t setsid(void); 返回值:若成功則為進(jìn)程組返
10、回值:若成功則為進(jìn)程組ID,出錯(cuò)則為出錯(cuò)則為-1n該函數(shù)是實(shí)現(xiàn)守護(hù)進(jìn)程必須調(diào)用和非常重要的函數(shù)。該函數(shù)是實(shí)現(xiàn)守護(hù)進(jìn)程必須調(diào)用和非常重要的函數(shù)。n如果調(diào)用進(jìn)程不是一個(gè)進(jìn)程組的組長,則此函數(shù)創(chuàng)建一個(gè)新的會(huì)話:如果調(diào)用進(jìn)程不是一個(gè)進(jìn)程組的組長,則此函數(shù)創(chuàng)建一個(gè)新的會(huì)話:n此進(jìn)程變成該會(huì)話的首進(jìn)程,同時(shí)是該會(huì)話的唯一進(jìn)程;此進(jìn)程變成該會(huì)話的首進(jìn)程,同時(shí)是該會(huì)話的唯一進(jìn)程;n此進(jìn)程成為一個(gè)新進(jìn)程組的組長進(jìn)程。新進(jìn)程組此進(jìn)程成為一個(gè)新進(jìn)程組的組長進(jìn)程。新進(jìn)程組ID是此調(diào)用進(jìn)是此調(diào)用進(jìn)程的進(jìn)程程的進(jìn)程ID;n此進(jìn)程沒有控制終端,如果在調(diào)用此進(jìn)程沒有控制終端,如果在調(diào)用setsid之前此進(jìn)程有一個(gè)控之前此進(jìn)程
11、有一個(gè)控制終端,那么這種聯(lián)系也被解除。制終端,那么這種聯(lián)系也被解除。n如果調(diào)用進(jìn)程已經(jīng)是一個(gè)進(jìn)程組長,則函數(shù)出錯(cuò)。為了保證不處于如果調(diào)用進(jìn)程已經(jīng)是一個(gè)進(jìn)程組長,則函數(shù)出錯(cuò)。為了保證不處于這種情況,通常首先調(diào)用這種情況,通常首先調(diào)用fork,然后使父進(jìn)程終止。,然后使父進(jìn)程終止。創(chuàng)建守護(hù)進(jìn)程#include#defineMAXFD64extern intdaemon_proc;/* defined in error.c */void daemon_init(const char *pname, int facility)inti;pid_tpid;if ( (pid = Fork() != 0)
12、exit(0);/* 父進(jìn)程終止 */* 1st child continues */setsid();/* 成為會(huì)話頭 */調(diào)試目的創(chuàng)建守護(hù)進(jìn)程(續(xù))Signal(SIGHUP, SIG_IGN);if ( (pid = Fork() != 0)exit(0);/* 第一個(gè)子程進(jìn)終止 */* 2nd child continues */daemon_proc = 1;/* for our err_XXX() functions */chdir(“/”);/* 改變工作目錄 */umask(0);/* 清除文件模式創(chuàng)建掩碼,使新文件的權(quán)限位不受原先文件模式創(chuàng)建掩碼的權(quán)限位的影響*/for (i
13、 = 0; i MAXFD; i+) /*關(guān)閉所有打開的文件描述字關(guān)閉所有打開的文件描述字*/close(i);openlog(pname, LOG_PID, facility); /*用用syslogd處理錯(cuò)誤處理錯(cuò)誤*/程序說明n第一次調(diào)用fork的目的是保證調(diào)用setsid的調(diào)用進(jìn)程不是進(jìn)程組長。(而setsid函數(shù)是實(shí)現(xiàn)與控制終端脫離的唯一方法);nsetsid函數(shù)使進(jìn)程成為新會(huì)話的會(huì)話頭和進(jìn)程組長,并與控制終端斷開連接;n第二次調(diào)用fork的目的是:即使守護(hù)進(jìn)程將來打開一個(gè)終端設(shè)備,也不會(huì)自動(dòng)獲得控制終端。(因?yàn)樵赟VR4中,當(dāng)沒有控制終端的會(huì)話頭進(jìn)程打開終端設(shè)備時(shí),如果這個(gè)終端不是
14、其他會(huì)話的控制終端,該終端將自動(dòng)成為這個(gè)會(huì)話的控制終端),這樣可以保證這次生成的進(jìn)程不再是一個(gè)會(huì)話頭。n忽略SIGHUP信號的原因是,當(dāng)?shù)谝淮紊傻淖舆M(jìn)程(會(huì)話頭)終止時(shí),該會(huì)話中的所有進(jìn)程(第二次生成的子進(jìn)程)都會(huì)收到該信號;守護(hù)進(jìn)程方式運(yùn)行的時(shí)間服務(wù)器#includeint main(int argc, char *argv)intlistenfd, connfd;socklen_taddrlen, len;struct sockaddr*cliaddr;charbuffMAXLINE;time_tticks;daemon_init(argv0, 0);if (argc = 2)liste
15、nfd = Tcp_listen(NULL, argv1, &addrlen);else if (argc = 3)listenfd = Tcp_listen(argv1, argv2, &addrlen);時(shí)間服務(wù)器elseerr_quit(usage: daytimetcpsrv2 );cliaddr = Malloc(addrlen);for ( ; ; ) len = addrlen;connfd = Accept(listenfd, cliaddr, &len);err_msg(connection from %s, Sock_ntop(cliaddr, le
16、n); ticks = time(NULL); snprintf(buff, sizeof(buff), %.24srn, ctime(&ticks); Write(connfd, buff, strlen(buff);Close(connfd);程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果源程序time.c#include #include #include #include #include #include #include #define MAXFD 64#define MAXLINE 255void daemon_init(const char *pname, int facility) int
17、 i; pid_t pid; if ( (pid =fork() != 0) exit(0); /* 父進(jìn)程終止 */ /* 1st child continues */ setsid(); /* 成為會(huì)話頭 */ signal(SIGHUP, SIG_IGN); if ( (pid = fork() != 0) exit(0); /* 第一個(gè)子程進(jìn)終止 */ /* 2nd child continues */ chdir(/); /* 改變工作目錄 */ umask(0); /* 清除文件模式創(chuàng)建掩碼,使新文件的權(quán)限位不受原先文件模式創(chuàng)建掩碼的權(quán)限位的影響*/ for (i = 0; i M
18、AXFD; i+) /*關(guān)閉所有打開的文件描述字*/ close(i); openlog(pname, LOG_PID, facility); /*用syslogd處理錯(cuò)誤*/int main(int argc,char *argv)int listenfd, connfd; socklen_t addrlen, len; struct sockaddr cliaddr; struct sockaddr_in server; char buffMAXLINE; time_t ticks; bzero(&server, sizeof(server); bzero(&cliaddr
19、,sizeof(cliaddr); server.sin_family = AF_INET; server.sin_port = htons(1234); server.sin_addr.s_addr = htonl(INADDR_ANY); daemon_init(argv0, 0); if(listenfd=socket(AF_INET, SOCK_STREAM, 0)=-1) syslog(LOG_NOTICE|LOG_LOCAL0,socket error); / perror(Create socket failed); exit(-1); if (bind(listenfd, (s
20、truct sockaddr *)&server, sizeof(struct sockaddr)=-1) / perror(Bind error); syslog(LOG_NOTICE|LOG_LOCAL0,socket error); exit(-1); if(listen(listenfd,5)=-1) / perror(listen error); exit(1); for ( ; ; ) len = sizeof(cliaddr); connfd = accept(listenfd,&cliaddr, &len); / err_msg(connection f
21、rom %s, sock_ntop(cliaddr, len); ticks = time(NULL); snprintf(buff, sizeof(buff), %.24srn, ctime(&ticks);int a;if(a= write(connfd, buff, strlen(buff)=-1) perror(write error); close(connfd); 客戶端timeclient.c#include #include #include #include #include #define PORT 1234#define MAXDATASIZE 100int ma
22、in(int argc, char *argv) int fd, numbytes; char bufMAXDATASIZE; struct hostent * he; struct sockaddr_in server; if (argc != 2) printf(Usage: %s n, argv0); exit(-1); if (he = gethostbyname(argv1) = NULL) perror(gethostbyname error.); exit(1); if (fd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(Crea
23、te socket failed.); exit(1); bzero(&server, sizeof(server); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr = *(struct in_addr *) he-h_addr); if (connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr) = -1) perror(connect failed.); exit(1); if( (numbytes
24、= recv(fd, buf, MAXDATASIZE, 0) = -1) perror(recv error.); exit(1); bufnumbytes =0; printf(Server Message: %sn,buf); close(fd);編寫守護(hù)進(jìn)程的注意事項(xiàng)n當(dāng)程序開始時(shí),盡快調(diào)用daemon_init,使之變成守護(hù)進(jìn)程,否則容易受控制終端影響;n守護(hù)進(jìn)程必須避免調(diào)用printf和fprintf函數(shù),而調(diào)用syslog函數(shù)。inetd:超級網(wǎng)絡(luò)服務(wù)器n4.3BSD以前的版本中的每個(gè)網(wǎng)絡(luò)服務(wù)有一個(gè)與之對應(yīng)的進(jìn)程,它們的啟動(dòng)幾乎完全一樣(如創(chuàng)建套接字,綁定地址,監(jiān)聽端口),這種模
25、型存在以下問題:n這些守護(hù)進(jìn)程有幾乎相同的代碼,首先是創(chuàng)建套接字,還要考慮變成守護(hù)進(jìn)程;n每個(gè)守護(hù)進(jìn)程在進(jìn)程表中要占一項(xiàng),但它們在大多數(shù)時(shí)間處于睡眠狀態(tài);inetd:超級網(wǎng)絡(luò)服務(wù)器(續(xù))n4.3BSD通過一個(gè)網(wǎng)絡(luò)超級服務(wù)器inet守護(hù)進(jìn)程簡化了上述問題:n大部分啟動(dòng)時(shí)要做的工作由inetd處理,所有守護(hù)進(jìn)程的編寫得到簡化。這避免了每個(gè)服務(wù)器程序都要調(diào)用daemon_init函數(shù);n單個(gè)進(jìn)程(inetd)能為多個(gè)服務(wù)等待客戶的請求,取代了每個(gè)服務(wù)一個(gè)進(jìn)程的方式,這樣減少了系統(tǒng)中的進(jìn)程數(shù);inetd守護(hù)進(jìn)程的工作流程n啟動(dòng)時(shí)讀取/etc/inetd.conf文件并給文件中指定的所有服務(wù)創(chuàng)建一個(gè)相應(yīng)
26、類型的套接字,inetd能處理的服務(wù)器數(shù)目依賴于它最多能創(chuàng)建的描述字的數(shù)目。每個(gè)創(chuàng)建的套接字都被加入到select調(diào)用的描述字集中;n為每個(gè)套接字調(diào)用bind,給它們捆綁服務(wù)器的眾所周知端口和通配地址。n對tcp套接字調(diào)用listen,以接受外來的連接請求;n所有套接字建立后,調(diào)用select等待這些套接字變?yōu)榭勺x;nSelect返回一個(gè)可讀的套接字后,如果是一個(gè)tcp套接字,就調(diào)用accept接受這個(gè)新的連接;ninetd守護(hù)進(jìn)程fork,由子進(jìn)程處理服務(wù)請求。子進(jìn)程關(guān)閉除連接套接字以外的所有描述字;n如果是tcp套接字,父進(jìn)程必須關(guān)閉連接套接字。inetd守護(hù)進(jìn)程的工作流程socket()bind()listen()如果是tcp套接字select()等待可讀條件accept()如果是tcp套接字fork()close已連接套接字(如果是tcp)close已連接套接字之外的所有描述字將套接字描述字dup
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國氣動(dòng)釘槍行業(yè)投資研究分析及發(fā)展前景預(yù)測報(bào)告
- 2025年中國調(diào)料行業(yè)發(fā)展?jié)摿︻A(yù)測及投資戰(zhàn)略研究報(bào)告
- 電器可行性報(bào)告范文
- 2025年中國智能控制器行業(yè)發(fā)展趨勢及投資前景預(yù)測報(bào)告
- 2025-2030年中國建材預(yù)制構(gòu)件項(xiàng)目投資可行性研究分析報(bào)告
- 名表培訓(xùn)課件
- 建筑工程施工合同
- 中國音樂播放器行業(yè)發(fā)展監(jiān)測及市場發(fā)展?jié)摿︻A(yù)測報(bào)告
- 輪紋特膠懸劑行業(yè)深度研究分析報(bào)告(2024-2030版)
- 中國汽車防銹市場競爭格局及投資戰(zhàn)略規(guī)劃報(bào)告
- Andhadhun Theme 02 《調(diào)音師》鋼琴譜鋼琴簡譜 數(shù)字譜 鋼琴雙手簡譜
- 一級圓柱齒輪減速器的設(shè)計(jì)計(jì)算22001文檔
- 第19章一次函數(shù)-一次函數(shù)專題數(shù)形結(jié)合一一次函數(shù)與45°角模型講義人教版數(shù)學(xué)八年級下冊
- 2023年四川省宜賓市敘州區(qū)數(shù)學(xué)六年級第二學(xué)期期末考試模擬試題含解析
- 幼兒園警察職業(yè)介紹課件
- 滅火器維修與報(bào)廢規(guī)程
- 皮膚病的臨床取材及送檢指南-修訂版
- 機(jī)型理論-4c172實(shí)用類重量平衡
- 管道工廠化預(yù)制推廣應(yīng)用課件
- 海水的淡化精品課件
- 項(xiàng)目工程移交生產(chǎn)驗(yàn)收報(bào)告
評論
0/150
提交評論