freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

顧客服務(wù)員程序設(shè)計要點-資料下載頁

2025-07-27 00:33本頁面
  

【正文】 nues */ setsid()。 /* bee session leader */ Signal(SIGHUP, SIG_IGN)。 if ( (pid = Fork()) != 0) exit(0)。 /* 1st child terminates */ /* 2nd child continues */ daemon_proc = 1。 /* for our err_XXX() functions */ chdir(/)。 /* change working directory */ umask(0)。 /* clear our file mode creation mask */ for (i = 0。 i MAXFD。 i++) close(i)。 openlog(pname, LOG_PID, facility)。} 在這個程序中有幾點需要說明:1. 為出錯處理函數(shù)設(shè)置標(biāo)識:程序中將全局變量daemon_proc設(shè)成非0。這個外部變量為非0時,出錯處理函數(shù)將調(diào)用syslog函數(shù)取代用fprintf輸出到標(biāo)準(zhǔn)錯誤輸出。這樣用戶不必從頭到尾改程序,就可以讓服務(wù)器在以非守護進程方式運行時(測試服務(wù)器時)調(diào)用一個自己的出錯處理函數(shù),而在以守護進程方式運行時調(diào)用syslog。2. 改變工作目錄并清除文件模式創(chuàng)建掩碼:chdir(/)將當(dāng)前工作目錄改到根目錄,不過確實有些守護進程將它改到其它目錄。例如,打印機守護進程可能會把工作目錄改為打印機的假脫機處理(spool)目錄,即它工作時要使用的目錄。守護進程如果產(chǎn)生core文件,這個core文件將在工作目錄下。改變工作目錄的另一個原因是守護進程可能在任意文件系統(tǒng)中啟動,如果保持工作目錄不變,該文件系統(tǒng)就不能拆卸(unmount)。文件模式創(chuàng)建掩碼被重置成0(umask(0)),這樣守護進程創(chuàng)建自己的文件時,新文件的權(quán)限位不受原來的文件模式創(chuàng)建掩碼的權(quán)限位的影響。3. 關(guān)閉所有打開的文件描述符:關(guān)閉本守護進程從運行它的進程(通常為shell)繼承而來的所有打開的文件描述符。沒有一個Unix函數(shù)能夠提供系統(tǒng)正在使用的最大的文件描述字。有方法能夠得到一個進程能打開的最大的描述字數(shù)目,但由于這個限制可能是無限的,所以確定最大描述字本身機也變得復(fù)雜。這里的解決方法是關(guān)閉前64個描述字,即使它們之中可能有很多并沒有打開。有些守護進程以讀寫方式打開/dev/null,并將它復(fù)制到標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。這樣可以保證這些常用的描述字是打開的,從這些描述字讀時會返回0(文件結(jié)束符),向它們寫時內(nèi)核會丟棄所有寫入的信息。之所以要打開這些描述符是因為,這樣做守護進程調(diào)用的那些假定能使用標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出的庫函數(shù)就不會發(fā)生問題。另外,有些守護進程打開一個登記文件,并將其描述字復(fù)制到標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。4. 用syslogd處理錯誤:調(diào)用openlog。調(diào)用者一般將第一個參數(shù)設(shè)置成程序名。這里的設(shè)置將進程號加到每條登記消息中。這里還設(shè)定了facility參數(shù),如果缺省值能滿足要求的話可設(shè)置為0。守護進程運行時沒有控制終端,所以它不會收到來自內(nèi)核的SIGHUP信號。因此很多守護進程將該信號作為管理員通知其配置文件已修改使用,守護進程收到SIGHUP信號后應(yīng)重新讀入配置文件。另外兩個守護進程不應(yīng)該收到的信號是SIGINT和SIGWINCH,這些信號也可以用作通知守護進程一些其它事項。 避免守護進程本身的多個副本互相干擾 網(wǎng)絡(luò)守護進程通常占用固定的端口資源和其它一些所需要的資源,如果系統(tǒng)中同時運行一個服務(wù)進程的多個副本,則它們之間可能會互相干擾。 為了避免這種干擾,用戶可以使用某種互斥的手段,使得系統(tǒng)中沒有兩個相同的守護進程同時運行。一種方法是每個進程在運行前先檢測某個確定的文件是否存在,如果文件存在,則說明已經(jīng)有一個守護進程運行了,進程將退出。否則,如果進程發(fā)現(xiàn)文件還沒有被創(chuàng)建,則它將繼續(xù)執(zhí)行。當(dāng)進程退出時,它將刪除這個文件。圖411說明了這個思想。 這種方法有一個缺陷,即如果系統(tǒng)異常崩潰,那么守護進程可能沒有機會刪除那個文件,導(dǎo)致相應(yīng)的守護進程無法啟動。要使守護進程正常運行,就需要在它運行之前將該文件刪除。(使用其它的互斥資源信號量,也有類似的問題。)Y文件是否存在?進程退出N創(chuàng)建文件……進程退出刪除文件圖411 創(chuàng)建文件的方法避免多副本 用戶可以使用鎖文件的方式取代判定創(chuàng)建文件的方法,兩者雖然思路相似,但因為對文件的加鎖,將在系統(tǒng)崩潰時自動釋放,所以加鎖的方法更加有效。 Inetd超級服務(wù)員 在典型的Unix/Linux系統(tǒng)中有很多服務(wù)器運行,等待用戶的請求并進行相應(yīng)的服務(wù)。,這些服務(wù)都有一個與之對應(yīng)的進程。這些進程在系統(tǒng)啟動時從/etc/rc文件里啟動,它們啟動時所做的工作基本相同:創(chuàng)建套接口,給它捆綁到服務(wù)器的眾所周知端口,等待連接(如果是TCP協(xié)議)或數(shù)據(jù)報(如果是UDP協(xié)議),然后執(zhí)行fork。由fork產(chǎn)生的子進程為用戶服務(wù),父進程繼續(xù)等待下一個用戶請求。該模型有兩個問題:1. 這些守護進程都以幾乎相同的啟動代碼工作,首先是創(chuàng)建套接口,還要考慮變成守護進程(與daemon_init函數(shù)類似)。2. 每個守護進程在進程表中占有一項,但它們大部分時間處于睡眠狀態(tài),消耗了許多系統(tǒng)內(nèi)存資源。:inetd守護進程使這些問題得到簡化。之所以稱為超級服務(wù)器。是因為它能夠處理多種網(wǎng)絡(luò)服務(wù)。典型的FTP、Telnet、TFTP、Rlogin等服務(wù)都是由這個超級服務(wù)器來間接提供的?;赥CP或者UDP的服務(wù)器都可以使用這個守護進程。但它不處理其它的協(xié)議,如Unix域套接口。該守護進程解決了上面提到的兩個問題。1. 因為大部分啟動時要做的工作由inetd處理,所以守護進程的編寫得到簡化。這避免了每個服務(wù)器程序都要調(diào)用daemon_init函數(shù)。2. 單個進程(inetd)能為多種服務(wù)等待用戶的請求,取代了每種服務(wù)一個進程的方式。這樣減少了系統(tǒng)中的進程總數(shù),并縮小了資源開銷。inetd進程使用daemon_init函數(shù)中的技術(shù)將自己變成一個守護進程,然后讀入并處理它的配置文件,通常為/etc/。這個文本文件規(guī)定了這個超級服務(wù)員要接收哪些請求,收到這些請求后又要提供哪些服務(wù)。這個文件每一行所包括的字段列在圖412中??梢粤谐鰩仔凶鳛槔樱? ftp stream tcp nowait root /etc/ftpd ftpd telnet stream tcp nowait root /etc/telnetd telnetd login stream tcp nowait root /etc/rlogind rlogindtftp dgram udp wait nobody /etc/tftpd tftpd字 段描 述service_name必須在/etc/services中socket_typestream或dgramprotocol必須在/etc/protocol(TCP或UDP)中wait_flagWait或nowaitlogin_name取自/etc/passwd文件中,通常為rootserver_program至exec的完整路徑名server_program_arguments最多五個變元圖412 inetd結(jié)構(gòu)文件中的字段 /etc/:1. 服務(wù)名稱(service_name):這個服務(wù)名稱必須在/etc/services中定義。2. 套接字類型(socket_type):套接字是流套接字還是傾聽套接字類型。3. 使用的協(xié)議類型(protocol):即TCP協(xié)議或者UDP協(xié)議。有的服務(wù)可能同時支持兩種協(xié)議。4. 等待狀態(tài)(wait_flag):如果指定為nowait,超級服務(wù)器將允許指定的服務(wù)并發(fā),它將在本次服務(wù)未完成時,啟動下一次服務(wù)。否則,該項服務(wù)將不能并發(fā)執(zhí)行,一次只能服務(wù)于一個用戶進程,下一個用戶進程只能等到本次服務(wù)結(jié)束后才能得到服務(wù)。5. 用戶名(login_name):服務(wù)器將以該用戶名對應(yīng)的權(quán)限運行進程。由于inetd是具有超級權(quán)限的進程,而有些服務(wù)可能是某個用戶自己編寫的,不應(yīng)當(dāng)或沒有必要以超級用戶的權(quán)限運行。inetd將根據(jù)這個記錄在exec加載子進程時修改進程的運行權(quán)限。6. 服務(wù)器的可執(zhí)行文件的位置(server_program):inetd使用這個項目定位服務(wù)器程序的位置(使用絕對路徑名)。7. 程序的參數(shù)(server_program_arguments):inetd將在exec函數(shù)中使用這行參數(shù)。圖413畫出了這個守護程序的流程,有代表性的步驟有: (1)啟動時讀入/etc/,并且為該文件中每一個服務(wù)員生成一個類型適當(dāng)?shù)?流/數(shù)據(jù)報)管座。由于inetd所用的文件描述符總數(shù)不能超過系統(tǒng)規(guī)定的上限值,所以inetd可以等候的服務(wù)員的數(shù)量也有一定限制。在大多數(shù)BSD系統(tǒng)中,這個上限值為64,不過重新構(gòu)造內(nèi)核也可以改變這個值。 (2)生成每一個管座后要執(zhí)行bind,為該服務(wù)員指定一個眾所周知的地址。查找/etc/services文件中的構(gòu)造文件的service_name字段可以得到TCP/UDP端口號。對應(yīng)于上面所列的結(jié)構(gòu)文件中的4行,在這個文件中有如下4行: ftp 21/tcp telnet 23/tcp tftp 69/udp login 513/tcp /etc/。在inetd結(jié)構(gòu)文件中的service_name(如telnet)和protocol都作為變元傳送給庫函數(shù)getservbyname,用來為bind確定正確的端口號的位置。 (3)對于流管座要執(zhí)行l(wèi)isten,表示希望在該管道上接收連接,并指定用于輸入連接的隊列的長度。對于數(shù)據(jù)報管座不必執(zhí)行這一步。 (4)執(zhí)行select,等待第一個管座變?yōu)榭勺x入。當(dāng)一個連接請求到達流管座時就認為它變?yōu)榭勺x;對于數(shù)據(jù)報管座來說,當(dāng)數(shù)據(jù)報到達時就變?yōu)榭勺x。在這一步,inetd守護程序只是等待select系統(tǒng)調(diào)用返回。 (5)當(dāng)一個管座變?yōu)榭勺x時,若它是流管座,則執(zhí)行accept系統(tǒng)調(diào)用接受該連接。 (6)fork,并且由子進程來處理這個服務(wù)請求。這個子進程首先把除了正在處理的這個管座描述符之外的所有文件描述符全部關(guān)閉,然后調(diào)用dup2,把該管套復(fù)制到文件描述符0、l、2上,原來的管套描述符關(guān)閉。這樣,在子進程上只打開文件描述符0、l、2,然后它調(diào)用getpwnam,獲得在/etc/。如果這個入口的用戶ID不為“0”(不是特權(quán)用戶),那么執(zhí)行setgid和setuid系統(tǒng)調(diào)用,使子進程變?yōu)橹付ǖ挠脩?由于inetd進程是以用戶ID為“0”來執(zhí)行的,它的子進程通過fork也繼承了這個用戶ID,所以它可以變成任何選定的用戶)?,F(xiàn)在,子進程用exec執(zhí)行適當(dāng)?shù)姆?wù)員程序來處理服務(wù)請求,傳送在結(jié)構(gòu)文件中的指定的一些變元。(7)如果這個管座是一個流管座,那么父進程必須把這個連接的管座關(guān)閉。父進程再一次執(zhí)行select系統(tǒng)調(diào)用,等待下一個管座變?yōu)榭勺x。圖413 inetd的執(zhí)行步驟上面所討論的方案是在結(jié)構(gòu)文件中指定服務(wù)員為nowait的情況,典型例子是所有TCP服務(wù)員。如果對于同一個服務(wù)員又有另一個連接請求到達,它執(zhí)行select之后立即回到父進程,上面所列的步驟又重做一遍,由另一個子進程來處理這個新的服務(wù)請求。 許多廠商都在inetd實現(xiàn)中加入了一些自己的功能。例如,在TCP和UDP服務(wù)器之外,加入處理遠程過程調(diào)用(RPC)服務(wù)器的能力。以及處理除TCP和UDP外其它協(xié)議的能力。當(dāng)然,exec服務(wù)器程序使用的路徑名和命令行參數(shù)也依賴于具體的實現(xiàn)。 IPv6與/etc/。一些廠商用名為tcp6和udp6的protocol表示應(yīng)為該服務(wù)創(chuàng)建一個IPv6套接口。 守護進程是在后臺運行的,獨立于所有終端控制的進程。大多數(shù)網(wǎng)絡(luò)服務(wù)器是以守護進程的方式運行。守護進程的所有輸出通常是調(diào)用syslog函數(shù)發(fā)送給syslogd守護進程。管理員可以根據(jù)發(fā)送消息的守護進程以及消息的緊急程度,完全控制如何處理這些消息。 多數(shù)Unix服務(wù)器是由inetd守護進程啟動的。它處理了所有轉(zhuǎn)變成守護進程所需要的步驟,在啟動真正的服務(wù)器時套接口已在標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤輸出上打開。這樣接不必在調(diào)用socket、bind、listenhe 和accept了,因為這些操作inetd已經(jīng)完成。27 / 27
點擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1