嵌入式筆記.doc_第1頁(yè)
嵌入式筆記.doc_第2頁(yè)
嵌入式筆記.doc_第3頁(yè)
嵌入式筆記.doc_第4頁(yè)
嵌入式筆記.doc_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2.1守護(hù)進(jìn)程簡(jiǎn)介L(zhǎng)inux服務(wù)器在啟動(dòng)時(shí)需要啟動(dòng)很多系統(tǒng)服務(wù),它們向本地和網(wǎng)絡(luò)用戶提供了Linux的系統(tǒng)功能接口,直接面向應(yīng)用程序和用戶。提供這些服務(wù)的程序是由運(yùn)行在后臺(tái)的守護(hù)進(jìn)程(daemons)來(lái)執(zhí)行的。守護(hù)進(jìn)程是生存期長(zhǎng)的一種進(jìn)程。它們獨(dú)立于控制終端并且周期性的執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。他們常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。linux系統(tǒng)有很多守護(hù)進(jìn)程,大多數(shù)服務(wù)器都是用守護(hù)進(jìn)程實(shí)現(xiàn)的。同時(shí),守護(hù)進(jìn)程完成許多系統(tǒng)任務(wù),比如,作業(yè)規(guī)劃進(jìn)程crond、打印進(jìn)程lqd等。有些書籍和資料也把守護(hù)進(jìn)程稱作:“服務(wù)”。選擇運(yùn)行哪些守護(hù)進(jìn)程,要根據(jù)具體需求決定。2.2守護(hù)進(jìn)程特征:1.所有守護(hù)進(jìn)程都以超級(jí)用戶(用戶ID為0)的優(yōu)先權(quán)運(yùn)行。2.沒有一個(gè)守護(hù)進(jìn)程具有控制終端終端名稱設(shè)置為問號(hào),終端前臺(tái)進(jìn)程組ID設(shè)置為-1.缺少控制終端可能是精靈進(jìn)程調(diào)用setsid的結(jié)果。3.除update以外的所有精靈進(jìn)程都是進(jìn)程組的首進(jìn)程,對(duì)話期的首進(jìn)程,而且是這些進(jìn)程組和對(duì)話期中得唯一進(jìn)程。Update是它所在進(jìn)程組和對(duì)話期(中得唯一進(jìn)程,但是該進(jìn)程組的首進(jìn)程(可能也是該對(duì)話期的首進(jìn)程)已經(jīng)終止。)4.所有這些守護(hù)進(jìn)程的父進(jìn)程都是init進(jìn)程。2.3守護(hù)進(jìn)程編程規(guī)則(5步)(1)創(chuàng)建子進(jìn)程,父進(jìn)程推出:首先調(diào)用fork,然后使父進(jìn)程exit。實(shí)現(xiàn)了:1,如果該守護(hù)進(jìn)程是一個(gè)簡(jiǎn)單shell命令啟動(dòng)的,那么父進(jìn)程終止使得shell認(rèn)為這條命令已經(jīng)執(zhí)行完成。2,子進(jìn)程繼承父的進(jìn)程組ID,但具有一個(gè)新的進(jìn)程ID,保證子不是進(jìn)程組首進(jìn)程。這對(duì)于下面就要做的setsid調(diào)用是必要的前提條件。(2)調(diào)用setsid以創(chuàng)建一個(gè)新的會(huì)話,并且擔(dān)任會(huì)話組組長(zhǎng)。調(diào)用setsid作用:1,脫離以前的會(huì)話組;2,脫離以前的進(jìn)程組;3,脫離以前的控制終端。(3)改變當(dāng)前目錄為根目錄 Chdir(“/”);(4)重設(shè)文件權(quán)限掩碼 Umask(0);(5)關(guān)閉不再需要的文件描述符。For(i=0;iMAXFILE;I+)Close(i);3.1syslog函數(shù)說(shuō)明Openlog函數(shù)用于打開系統(tǒng)日志服務(wù)(Linux系統(tǒng)中的日志子系統(tǒng)對(duì)于系統(tǒng)安全來(lái)說(shuō)非常重要,它記錄了系統(tǒng)每天發(fā)生的各種各樣的事情,包括那些用戶曾經(jīng)或者正在使用系統(tǒng),可以通過(guò)日志來(lái)檢查錯(cuò)誤發(fā)生的原因,更重要的是在系統(tǒng)受到黑客攻擊后,日志可以記錄下攻擊者留下的痕跡,通過(guò)查看這些痕跡,系統(tǒng)管理員可以發(fā)現(xiàn)黑客攻擊的某些手段以及特點(diǎn),從而能夠進(jìn)行處理工作,為抵御下一次攻擊做好準(zhǔn)備。)的一個(gè)連接;Syslog函數(shù)用于向日志文件中寫入信息,在這里可以規(guī)定消息的優(yōu)先級(jí),消息的輸出格式等;Closelog函數(shù)用于關(guān)閉系統(tǒng)日志服務(wù)的連接。4.共享內(nèi)存共享內(nèi)存實(shí)現(xiàn)分為兩個(gè)步驟:一, 創(chuàng)建共享內(nèi)存,使用shmget函數(shù)。二, 映射共享內(nèi)存,將這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去,使用shmat函數(shù)。5.消息隊(duì)列消息隊(duì)列就是消息的一個(gè)連接,它允許一個(gè)或多個(gè)進(jìn)程向它寫消息,一個(gè)或多個(gè)進(jìn)程從中讀消息。具有一定的FIFO的特性,但是可實(shí)現(xiàn)消息的隨機(jī)查詢。這些消息存在于內(nèi)核中,由“隊(duì)列ID”來(lái)標(biāo)識(shí)。消息隊(duì)列的實(shí)現(xiàn)包括創(chuàng)建和打開隊(duì)列,添加消息,讀取消息和控制消息隊(duì)列這四種操作。Msgget:創(chuàng)建和打開隊(duì)列,其消息數(shù)量受系統(tǒng)限制。Msgsnd:添加消息,將消息添加到消息隊(duì)列尾部。Msgrcv:讀取消息,從消息隊(duì)列中取走消息。Msgctl:控制消息隊(duì)列。Linux的系統(tǒng)調(diào)用與文件IO1.1, linux系統(tǒng)調(diào)用 所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序的一組“特殊”接口,用戶程序可以通過(guò)這組“特殊”接口來(lái)獲得操作系統(tǒng)內(nèi)核提供的特殊服務(wù)。系統(tǒng)調(diào)用,api與系統(tǒng)命令之間的關(guān)系2.3open函數(shù)(如果文件不存在則創(chuàng)建,如果文件存在則打開)#inlude#inlude#inludeInt open(const char *pathname, int oflag,/*,mode_t mode*/); / const是一個(gè)C語(yǔ)言的關(guān)鍵字,它限定一個(gè)變量不允許被改變返回:若成功為文件描述符,若出錯(cuò)為-1Pathname是要打開或創(chuàng)建的文件的名字。Oflag參數(shù)可用來(lái)說(shuō)明此函數(shù)的多個(gè)選擇項(xiàng)。對(duì)于open函數(shù)而言,僅當(dāng)創(chuàng)建新文件時(shí)才使用第三個(gè)參數(shù)。用下列一個(gè)或多個(gè)常數(shù)進(jìn)行或運(yùn)算構(gòu)成oflag參數(shù)(這些常數(shù)定義在頭文件中):O_RDONLY只讀打開。O_WRONLY只寫打開。O_RDWR讀,寫打開等等2.4creat函數(shù)可用creat函數(shù)創(chuàng)建一個(gè)新文件#inlude#inlude#inludeInt creat(const char *pathname,mode_t mode);返回:若成功為只寫打開的文件描述符,若出錯(cuò)為-1.注意,此函數(shù)等效于:open(pathname,O_WRONLY| O_CREAT| O_TRUNC,mode);creat的一個(gè)不足之處是它以只寫方式打開所創(chuàng)建的文件。2.5close函數(shù)可用close函數(shù)關(guān)閉一個(gè)打開文件:#inludeint close(int filedes);返回:若成功為0,若出錯(cuò)為-1 當(dāng)一個(gè)進(jìn)程終止時(shí),它所有的打開文件都由內(nèi)核自動(dòng)關(guān)閉。很多程序都使用這一功能而不顯式地用close關(guān)閉打開的文件。exit(1)/exit()就是退出,傳入的參數(shù)是程序退出時(shí)的狀態(tài)碼,0表示正常退出,其他表示非正常退出2.6lseek函數(shù)每個(gè)打開文件都有一個(gè)與其相關(guān)聯(lián)的“當(dāng)前文件偏移量”。它是一個(gè)非負(fù)整數(shù),用以度量從文件開始處計(jì)算的字節(jié)數(shù)。通常,讀,寫操作都從當(dāng)前文件偏移量處開始,并使偏移量增加所讀或?qū)懙米止?jié)數(shù)。按系統(tǒng)默認(rèn),當(dāng)打開一個(gè)文件時(shí),除非指定O_APPEND選擇項(xiàng),否則該位移量被設(shè)置為0.可以調(diào)用lseek顯示地定位一個(gè)打開文件。#inlude#inludeOff_t lseek(int filesdes,off_t offset,int whence);返回:若成功為新的文件位移,若出錯(cuò)為-1.對(duì)參數(shù)offset的解釋與參數(shù)whence的值有關(guān)。若lseek成功執(zhí)行,則返回新的文件位移量,為此可以用下列方式確定一個(gè)打開文件的當(dāng)前位移量:off_t currpos;currpos=lseek(fd,0,SEEK_CUR);2.7read函數(shù)用read函數(shù)從打開文件中讀數(shù)據(jù)#includeSsize_t read(int feledes,void *buff,size_t nbytes);返回:讀到的字節(jié)數(shù),若已到文件尾為零,若出錯(cuò)為-1. 如read成功,則返回讀到的字節(jié)數(shù)。如已到達(dá)文件的尾端,則返回0.2.8write函數(shù)用write函數(shù)向打開文件寫數(shù)據(jù)。#includeSsize_t write(int filedes , const void *buff,size_t nbytes);返回:若成功為已寫的字節(jié)數(shù),若出錯(cuò)為-1.其返回值通常與參數(shù)nbytes的值不同,否則表示出錯(cuò)。Write出錯(cuò)的一個(gè)常見原因是:磁盤已寫滿,或者超過(guò)了對(duì)一個(gè)給定進(jìn)程的文件長(zhǎng)度限制。對(duì)于普通文件,寫操作從文件的當(dāng)前位移量處開始。如果在打開該文件時(shí),指定了O_APPEND選擇項(xiàng),則在每次寫操作之前,將文件位移量設(shè)置在文件的當(dāng)前結(jié)尾處。在一次成功寫之后,該文件位移量增加實(shí)際寫的字節(jié)數(shù)。2.9fcntl函數(shù)Fcntl函數(shù)可以改變已經(jīng)打開文件的性質(zhì)。#inlude#inlude#inludeint fcntl(int filedes,int cmd,);返回:若成功則依賴于cmd(見下),若出錯(cuò)為-1。fcntl函數(shù)有五種功能:1,復(fù)制一個(gè)現(xiàn)存的描述符,新文件描述符作為函數(shù)值返(cmd=F_DUPFD)。2,獲得/設(shè)置文件描述符標(biāo)記,對(duì)應(yīng)于filedes的文件描述符標(biāo)志作為函數(shù)值返回。(cmd=F_GETFD或F_SETFD)。3,獲得/設(shè)置文件狀態(tài)標(biāo)志,對(duì)應(yīng)于filedes的文件狀態(tài)標(biāo)志作為函數(shù)值返回。(cmd=F_GETFL或F_SETFL)。4,獲得/設(shè)置異步I/O有權(quán)(cmd=F_GETOWN或F_SETOWN)。5,獲得/設(shè)置記錄鎖(cmd=F_SETLK,F_SETLKW)。文件狀態(tài)標(biāo)志說(shuō)明O_RDONLY只讀打開O_WRONLY只寫打開O_RDWR讀/寫打開O_APPEND寫時(shí)都添加至文件尾O_NONBLOCK非阻塞方式O_SYNC等待寫完成O_ASYNC異步I/O2.9.2用fcntl給文件加鎖當(dāng)多個(gè)用戶共同使用,操作一個(gè)文件的時(shí)候,linux通常采用的方法是給文件上鎖,來(lái)避免共享資源產(chǎn)生競(jìng)爭(zhēng)的狀態(tài)。文件鎖包括建議鎖和強(qiáng)制性鎖。建議性鎖要求上鎖文件的進(jìn)程都要檢測(cè)是否有鎖存在,并尊重已有的鎖。強(qiáng)制性鎖由內(nèi)核和系統(tǒng)執(zhí)行的鎖。Fcntl不僅可以實(shí)施建議性鎖且可以實(shí)施強(qiáng)制性鎖。2.9.3fcntl函數(shù)格式#inlude#inlude#inludeint fcntl(int filedes,int cmd,struct flock flockptr);Struct flock結(jié)構(gòu)2.9.4flock結(jié)構(gòu)說(shuō)明1,所希望的鎖類型:F_RDLCK(共享讀鎖),F_WRLCK(獨(dú)占性寫鎖),F_UNLCK(解鎖一個(gè)區(qū)域)2,要加鎖或解鎖的區(qū)域的起始地址,有l(wèi)_start和l_whence兩者決定。l_stat是相對(duì)位移量(字節(jié)),l_whence則決定了相對(duì)位移量的起點(diǎn)。3,區(qū)域的長(zhǎng)度,有l(wèi)_len表示。關(guān)于加鎖和解鎖區(qū)域的說(shuō)明還要注意下列各點(diǎn):1,該區(qū)域可以在當(dāng)前文件尾端處開始或越過(guò)其尾端處開始,但是不能在文件起始位置之前開始或越過(guò)該起始位置。2,如若l_len為0,則表示鎖的區(qū)域從其起點(diǎn)(由l_start和l_whence決定)開始直至最大可能位置為止。也就是不管添寫到該文件中多少數(shù)據(jù),它都處于鎖的范圍。3,為了鎖整個(gè)文件,通常的方法是l_start說(shuō)明為0,l_whence說(shuō)明為SEEK_SET,l_len說(shuō)明為0。2.10ioctl函數(shù)Ioctl函數(shù)式I/O操作的雜物箱。不能用本章中其他函數(shù)表示的I/O操作通常都能用ioctl表示。終端I/O是ioctl的最大使用方面,主要用于設(shè)備的I/O控制。#inlude#inludeint ioctl(int filedes,int request, );返回:若出錯(cuò)則為-1,若成功則為其他值。3,select實(shí)現(xiàn)I/O復(fù)用3.1 I/O處理的五種模型1,阻塞I/O模型:若所調(diào)用的I/O函數(shù)沒有完成相關(guān)的功能就會(huì)使進(jìn)程掛起,直到相關(guān)數(shù)據(jù)到達(dá)才會(huì)返回。如:終端,網(wǎng)絡(luò)設(shè)備的訪問。2,非阻塞模型:當(dāng)請(qǐng)求的I/O操作不能完成時(shí),則不讓進(jìn)程休眠,而且返回一個(gè)錯(cuò)誤。如:open,read,write訪問。3,I/O多路轉(zhuǎn)接模型:如果請(qǐng)求的I/O操作阻塞,且他不是真正阻塞I/O,而且讓其中的一個(gè)函數(shù)等待,在這期間,I/O還能進(jìn)行其他操作。如:select函數(shù)。4,信號(hào)驅(qū)動(dòng)I/O模型:在這種模型下,通過(guò)安裝一個(gè)信號(hào)處理程序,系統(tǒng)可以自動(dòng)捕獲特定信號(hào)的到來(lái),從而啟動(dòng)I/O。5,異步I/O模型:在這種模型下,當(dāng)一個(gè)描述符已準(zhǔn)備好,可以啟動(dòng)I/O時(shí),進(jìn)程會(huì)通知內(nèi)核。由內(nèi)核進(jìn)行后續(xù)處理,這種用法現(xiàn)在較少。3.2 select函數(shù)傳送select的函數(shù)告訴內(nèi)核:(1) 我們所關(guān)心的描述符;(2) 對(duì)于每個(gè)描述符我們所關(guān)心的條件(是否讀一個(gè)給定的描述符?是否想寫一個(gè)給定的描述符?是否關(guān)心一個(gè)描述符的異常條件?)。(3) 希望等待多長(zhǎng)時(shí)間(可以永遠(yuǎn)等待,等待一個(gè)固定量時(shí)間,或完全不等待)。 從select返回時(shí),內(nèi)核告訴我們:(1) 已準(zhǔn)備好的描述符的數(shù)量。(2) 哪一個(gè)描述符已準(zhǔn)備好讀,寫或異常條件。#inlude#inlude#inludeint select(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout );返回:準(zhǔn)備就緒的描述符數(shù),若超時(shí)則為0,若出錯(cuò)則為-1。Timeout值:1,null:永遠(yuǎn)等待,知道捕捉到信號(hào)或文件描述符已準(zhǔn)備好為止;2,具體值:struct timeval類型的指針,若等待為timeout時(shí)間還沒有文件描述符準(zhǔn)備好,就立即返回;3,0:從不等待,測(cè)試所有指定的描述符并立即返回;先說(shuō)明最后一個(gè)參數(shù),它指定愿意等待的時(shí)間。Struct timevalLong tv_sec;/*seconds*/Long tv_usec;/*and microseconds*/;Select函數(shù)根據(jù)希望進(jìn)行的文件操作對(duì)文件描述符進(jìn)行分類處理,這里,對(duì)文件描述符的處理主要設(shè)計(jì)4個(gè)宏函數(shù):FD_ZERO(fd_set *set)清除一個(gè)文件描述符集;FD_SET(int fd,fd_set *set)將一個(gè)文件描述符加入文件描述符集中;FD_CLR(int fd,fd_set *set)將一個(gè)文件描述符從文件描述符集中清除;FD_ISSET(int fd,fd_set *

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論