嵌入式操作系統(tǒng)(共12頁(yè))_第1頁(yè)
嵌入式操作系統(tǒng)(共12頁(yè))_第2頁(yè)
嵌入式操作系統(tǒng)(共12頁(yè))_第3頁(yè)
嵌入式操作系統(tǒng)(共12頁(yè))_第4頁(yè)
嵌入式操作系統(tǒng)(共12頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩7頁(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)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上問(wèn)答題1什么是嵌入式系統(tǒng),它由哪幾部分組成?嵌入式系統(tǒng)是指操作系統(tǒng)和功能軟件集成于計(jì)算機(jī)硬件系統(tǒng)之中。簡(jiǎn)單的說(shuō)就是系統(tǒng)的應(yīng)用軟件與系統(tǒng)的硬件一體化,類似與BIOS的工作方式。具有軟件代碼小,高度自動(dòng)化,響應(yīng)速度快等特點(diǎn)。特別適合于要求實(shí)時(shí)的和多任務(wù)的體系。根據(jù)IEEE的定義:嵌入式系統(tǒng)是“用于控制、監(jiān)視或者輔助操作機(jī)器和設(shè)備的裝置”。簡(jiǎn)單地講就是嵌入到對(duì)象體中的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)一般有3個(gè)主要的組成部分:硬件、實(shí)時(shí)操作系統(tǒng)以及應(yīng)用軟件。圖1.1 嵌入式系統(tǒng)三個(gè)組成部分硬件:包括處理器、存儲(chǔ)器、輸入輸出設(shè)備、其他部分輔助系統(tǒng)等。實(shí)時(shí)操作系統(tǒng):用于管理應(yīng)用軟件,并

2、提供一種機(jī)制,使得處理器分時(shí)地執(zhí)行各個(gè)任務(wù)并完成一定的時(shí)限要求.應(yīng)用軟件:實(shí)現(xiàn)具體業(yè)務(wù)邏輯功能。2嵌入式系統(tǒng)的三要素是什么?嵌入式系統(tǒng)的三要素是嵌入、專用、計(jì)算機(jī);其中嵌入性指的是嵌入到對(duì)象體系中,有對(duì)象環(huán)境要求;專用性是指軟、硬件按對(duì)象要求裁減;計(jì)算機(jī)指實(shí)現(xiàn)對(duì)象的智能化功能。廣義地說(shuō)一個(gè)嵌入式系統(tǒng)就是一個(gè)具有特定功能或用途的計(jì)算機(jī)軟硬件集合體。即以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng) 。3列舉五種以上的嵌入式實(shí)時(shí)操作系統(tǒng)?嵌入式實(shí)時(shí)操作系統(tǒng)是指操作系統(tǒng)本身要能在一個(gè)固定時(shí)限內(nèi)對(duì)程序調(diào)用(或外部事件)做出正確的反應(yīng)

3、,亦即對(duì)時(shí)序與穩(wěn)定性的要求十分嚴(yán)格。目前國(guó)際較為知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、 OS/9、VRTX、LynuxOS,RTLinux、BlueCat RT等。4嵌入式系統(tǒng)一般由幾層組成?簡(jiǎn)單介紹其作用?嵌入式系統(tǒng)一般由硬件層、中間層、軟件層和功能層組成。其作用分別如下:(1)硬件層 :由嵌入式微處理器、外圍電路和外設(shè)組成。外圍電路有:電源電路、復(fù)位電路、調(diào)試接口和存儲(chǔ)器電路,就構(gòu)成一個(gè)嵌入式核心控制模塊。操作系統(tǒng)和應(yīng)用程序都可以固化在ROM或者Flash中。為方便使用,有的模塊在此基礎(chǔ)上增加了LCD、鍵盤、USB接口,以及其他一些功能的擴(kuò)展電路。(

4、2)中間層 :硬件層與軟件層之間為中間層,也稱為BSP(Board Support Package,板級(jí)支持包)。作用:將系統(tǒng)軟件與底層硬件部分隔離,使得系統(tǒng)的底層設(shè)備驅(qū)動(dòng)程序與硬件無(wú)關(guān);功能:一般應(yīng)具有相關(guān)硬件的初始化、數(shù)據(jù)的輸入/輸出操作和硬件設(shè)備的配置等功能。BSP是主板硬件環(huán)境和操作系統(tǒng)的中間接口,是軟件平臺(tái)中具有硬件依賴性的那一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運(yùn)行于硬件主板上。(3)軟件層 :主要是操作系統(tǒng),有的還包括文件系統(tǒng)、圖形用戶接口和網(wǎng)絡(luò)系統(tǒng)等。操作系統(tǒng)是一個(gè)標(biāo)準(zhǔn)的內(nèi)核,將中斷、I/O、定時(shí)器等資源都封裝起來(lái),以方便用戶使用。(4)功能層 :由基于操作系統(tǒng)開(kāi)發(fā)

5、的應(yīng)用程序組成,用來(lái)完成對(duì)被控對(duì)象的控制功能。功能層是面向被控對(duì)象和用戶的,為了方便用戶操作,往往需要具有友好的人機(jī)界面。5簡(jiǎn)述嵌入式系統(tǒng)中非占先式與占先式調(diào)度算法的區(qū)別?非占先式調(diào)度法也稱作合作型多任務(wù),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。中斷服務(wù)可以使一個(gè)高優(yōu)先級(jí)的任務(wù)由掛起狀態(tài)變?yōu)榫途w狀態(tài)。但中斷服務(wù)以后控制權(quán)還是回到原來(lái)被中斷了的那個(gè)任務(wù),直到該任務(wù)主動(dòng)放棄CPU的使用權(quán)時(shí),那個(gè)高優(yōu)先級(jí)的任務(wù)才能獲得CPU的使用權(quán)。當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用占先式內(nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的CPU使用權(quán)就被剝

6、奪了,或者說(shuō)被掛起了,那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了CPU的控制權(quán)。6硬實(shí)時(shí)操作系統(tǒng),軟實(shí)時(shí)操作系統(tǒng)以及兩者的區(qū)別?在實(shí)時(shí)系統(tǒng)中,如果系統(tǒng)在指定的時(shí)間內(nèi)未能實(shí)現(xiàn)某個(gè)確定的任務(wù),會(huì)導(dǎo)致系統(tǒng)的全面失敗,這樣的系統(tǒng)被稱為強(qiáng)實(shí)時(shí)系統(tǒng)或硬實(shí)時(shí)系統(tǒng)。強(qiáng)實(shí)時(shí)系統(tǒng)響應(yīng)時(shí)間一般在毫秒或微秒級(jí)。在弱實(shí)時(shí)系統(tǒng)中,雖然響應(yīng)時(shí)間同樣重要,但是超時(shí)卻不會(huì)發(fā)生致命的錯(cuò)誤。其系統(tǒng)響應(yīng)時(shí)間在毫秒至秒的數(shù)量級(jí)上,其實(shí)時(shí)性的要求比強(qiáng)實(shí)時(shí)系統(tǒng)要差一些。7嵌入式系統(tǒng)的設(shè)計(jì)步驟有哪些?各部分主要工作是什么?(1)需求分析階段,羅列出用戶的需求; (2)體系結(jié)構(gòu)設(shè)計(jì)階段,描述系統(tǒng)的功能如何實(shí)現(xiàn); (3)詳細(xì)設(shè)計(jì)階段,進(jìn)行硬件系統(tǒng)與軟件系統(tǒng)的

7、分類劃分,以決定哪些功能用硬件實(shí)現(xiàn),哪些用軟件實(shí)現(xiàn); (4)系統(tǒng)集成,把系統(tǒng)的軟件、硬件和執(zhí)行裝置集成在一起,進(jìn)行調(diào)試,發(fā)現(xiàn)并改進(jìn)在設(shè)計(jì)過(guò)程中的錯(cuò)誤; (5)系統(tǒng)測(cè)試,對(duì)設(shè)計(jì)好的系統(tǒng)進(jìn)行測(cè)試,看其是否滿足給定的要求。 8. 1)cduser:改變目錄位置至用戶的工作目錄 2)cd:/user:改變目錄位置至相對(duì)路徑user 的目錄下 3)ls/root/-l:查看當(dāng)前目錄下的文件 4)cat/root/.bash_profile:查看文件.ba sh_profile的內(nèi)容 5more/etc/innittab:分頁(yè)查看inittab文件內(nèi)容 6)cp/tmp/file1 file2:將目錄/t

8、mp 下的文件file1 復(fù)制到當(dāng)前目錄下,文件名為f i l e 2 7)mv file1 dir1:將文件file1移到目錄dir1 下,文件名仍為file1 8)mkdir dir1:建立一新目錄d i r 1 9)rmdir dir1:刪除目錄dir1,但dir1 下必須沒(méi)有文件存在,否則無(wú)法刪除 10)rm file:刪除文件名中有五個(gè)字符且前四個(gè)字符為file 的所有文件 11)$ cat config:文件config的內(nèi)容依次顯示到屏幕上 12)more file1:以分頁(yè)方式查看文件名file1 的內(nèi)容 13)cat file1| more:以分頁(yè)方式查看文件名file1 的

9、內(nèi)容 14)du -s dir1:顯示目錄dir1 的總?cè)萘?15)chmod 755 dir1:對(duì)于目錄d i r 1,設(shè)定成任何使用者皆有讀取及執(zhí)行的權(quán)利,但只有所有者可做修改 16)chmod 700 file1:對(duì)于文件f i l e 1,設(shè)定只有所有者可以讀、寫和執(zhí)行的權(quán)利 17)ln -s file3 file4:將文件file4 鏈接至文件f i l e 3 18)grep abc file1:尋找文件f i l e 1中包含字符串a(chǎn)bc 所在行的文本內(nèi)容。 19)find/-name file1 -print:自根目錄下尋找文件file1 的路徑。 20)diff -r dir

10、1 dir2:比較目錄dir1 與dir2 內(nèi)各文件的不同之處。9 利用GDB進(jìn)行調(diào)試時(shí),可通過(guò)step或next命令進(jìn)行單步執(zhí)行 10VI三種模式:命令模式 末行模式 輸入模式11使用GCC編譯C程序生成可執(zhí)行文件有時(shí)似乎是一步完成的,但實(shí)際要經(jīng)歷四步:預(yù)處理、編譯、匯編和連接12.Linux 內(nèi)核的編譯菜單有好幾個(gè)版本,運(yùn)行: 1)make config:進(jìn)入命令行,可以一行一行的配置,但使用不十分方便。 2)make menuconfig:大多數(shù)開(kāi)發(fā)人員使用的Linux 內(nèi)核編譯菜單,使用方便。 3)make xconfig:在2.4.X 以及以前版本中xconfig 菜單是基于TCL/

11、TK 的圖形庫(kù)的。13.在完成內(nèi)核的裁減之后,內(nèi)核的編譯就只要執(zhí)行以下幾條命令:make clean 編譯內(nèi)核之前先把環(huán)境給清理干凈。有時(shí)你也可以用make realclean 或make mrproper 來(lái)徹底清除相關(guān)依賴,保證沒(méi)有不正確的.o 文件存在。make dep 編譯相關(guān)依賴文件 make zImage 創(chuàng)建內(nèi)核鏡像文件make modules 創(chuàng)建內(nèi)核模塊,若不創(chuàng)建內(nèi)核模塊,這步可以不要。make install 把相關(guān)文件拷貝到默認(rèn)的目錄。在給嵌入式設(shè)備編譯時(shí)這步可以不要。因?yàn)榫唧w的內(nèi)核安裝還需要你手工進(jìn)行。14.何為虛擬內(nèi)存?虛擬內(nèi)存的管理有何作用? 使用虛擬地址尋址整個(gè)系

12、統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存。MMU 便是實(shí)現(xiàn)虛擬內(nèi)存的必要條件。嵌入式處理器如果存在MMU ,由于在MMU具備內(nèi)存地址映射和尋址功能,操作系統(tǒng)會(huì)使用它完成從虛擬地址到物理地址的轉(zhuǎn)換, 所有的應(yīng)用程序只需要使用虛擬地址尋址數(shù)據(jù)。 虛擬內(nèi)存的管理方法使系統(tǒng)既可以運(yùn)行體積比物理內(nèi)存還要大的應(yīng)用程序,也可以實(shí)現(xiàn)“按需調(diào)頁(yè)”策略,既滿足了程序的運(yùn)行速度,又節(jié)約了物理內(nèi)存空間。15.進(jìn)程內(nèi)存區(qū)域涉及哪幾種數(shù)據(jù)段? 進(jìn)程內(nèi)存區(qū)域涉及到5種數(shù)據(jù)段,即:代碼段:代碼段是用來(lái)存放可執(zhí)行文件的操作指令,也就是說(shuō)是它是可執(zhí)行程序在內(nèi)存中的鏡像數(shù)據(jù)段:數(shù)據(jù)段用來(lái)存放可執(zhí)行文件中已初始化全局變量,

13、換句話說(shuō)就是存放程序靜態(tài)分配的變量和全局變量BSS段:BSS段包含了程序中未初始化的全局變量,在內(nèi)存中 BSS段全部置零堆:堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上;當(dāng)利用free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被剔除棧:棧是用戶存放程序臨時(shí)創(chuàng)建的局部變量,也就是說(shuō)函數(shù)括弧“”中定義的變量。除此以外,在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。16.簡(jiǎn)述內(nèi)核空間和用戶空間的區(qū)別 。 在Linux系統(tǒng)中,內(nèi)核在最高級(jí)執(zhí)行,也稱為

14、“系統(tǒng)態(tài)”,在這一級(jí)任何操作都可以執(zhí)行。而應(yīng)用程序則執(zhí)行在最低級(jí),即所謂的“用戶態(tài)”。在這一級(jí)處理器禁止對(duì)硬件的直接訪問(wèn)和對(duì)內(nèi)存的未授權(quán)訪問(wèn)。模塊是在所謂的“內(nèi)核空間”中運(yùn)行的,而應(yīng)用程序則是在“用戶空間”中運(yùn)行的。它們分別引用不同的內(nèi)存映射,也就是程序代碼使用不同的“地址空間”。17.簡(jiǎn)述共享內(nèi)存的作用。 共享內(nèi)存區(qū)域是被多個(gè)進(jìn)程共享的一部分物理內(nèi)存。如果多個(gè)進(jìn)程都把該內(nèi)存區(qū)域映射到自己的虛擬地址空間,則這些進(jìn)程就都可以直接訪問(wèn)該共享內(nèi)存區(qū)域,從而可以通過(guò)該區(qū)域進(jìn)行通信。共享內(nèi)存是進(jìn)程間共享數(shù)據(jù)的一種最快的方法,一個(gè)進(jìn)程向共享內(nèi)存區(qū)域?qū)懭肓藬?shù)據(jù),共享這個(gè)內(nèi)存區(qū)域的所有進(jìn)程就可以立刻看到其中的

15、內(nèi)容。這塊共享虛擬內(nèi)存的頁(yè)面,出現(xiàn)在每一個(gè)共享該頁(yè)面的進(jìn)程的頁(yè)表中。但是它不需要在所有進(jìn)程的虛擬內(nèi)存中都有相同的虛擬地址。18.簡(jiǎn)述內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系。 內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程(swapd)定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請(qǐng)求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。19.線程的同步方式有互斥量,信號(hào)燈和條件變量等,分析以上幾種同步方式可在什么場(chǎng)合下使用。 Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對(duì)該資源上鎖,以實(shí)現(xiàn)互斥地對(duì)獨(dú)占資源的使用。(3分)Semophore信號(hào)燈,信號(hào)燈內(nèi)有一計(jì)

16、數(shù)器,可以用于對(duì)多個(gè)同類資源的分配。當(dāng)資源用完時(shí),申請(qǐng)資源的線程會(huì)在信號(hào)量上睡眠,有線程釋放資源時(shí),再將該線程喚醒繼續(xù)運(yùn)行。(3分)Condition條件變量,條件變量用于等待信號(hào)。當(dāng)一個(gè)線程需要等待某個(gè)信號(hào)時(shí),就可到條件變量上等待,當(dāng)信號(hào)具備時(shí),系統(tǒng)會(huì)喚醒該線程繼續(xù)運(yùn)行。(4分)20.進(jìn)一步考慮當(dāng)兩個(gè)進(jìn)程處于不同機(jī)器上時(shí),需要采用的通信方式?本地:共享內(nèi)存+信號(hào)量, 適合于大量數(shù)據(jù)傳輸。Linux支持系統(tǒng)V和POSIX的共享內(nèi)存和信號(hào)量。(5分)遠(yuǎn)程:Socket+應(yīng)用協(xié)議。適合于跨網(wǎng)絡(luò)的(大量)數(shù)據(jù)傳輸。Linux支持BSD的socket。應(yīng)用層協(xié)議需要自行設(shè)計(jì)。21.程序,進(jìn)程,線程有何

17、區(qū)別和聯(lián)系 程序是編譯后形成的可執(zhí)行代碼,是靜止的。進(jìn)程是程序的一次執(zhí)行,是活動(dòng)的。線程是進(jìn)程的可執(zhí)行單元,同一進(jìn)程的不同線程共享進(jìn)程的資源和地址空間。22.多線程有幾種實(shí)現(xiàn)方法,線程間同步有幾種實(shí)現(xiàn)方法,分別都是什么? 兩種,一種是繼承Thread,另外一種是實(shí)現(xiàn)接口Runnable。 同步的實(shí)現(xiàn)方法有兩種,分別是synchronized, wait與notify。用synchronized可以對(duì)一段代碼、一個(gè)對(duì)象及一個(gè)方法進(jìn)行加鎖。用wait與notify可以使對(duì)象處于等待及喚醒方式導(dǎo)致同步,因?yàn)槊總€(gè)對(duì)象都直接或間接的繼承了Object類。23.Linux執(zhí)行進(jìn)程調(diào)度一般是在以下情況發(fā)生的

18、: 1)正在執(zhí)行的進(jìn)程運(yùn)行完畢;(2)正在執(zhí)行的進(jìn)程調(diào)用阻塞原語(yǔ)將自己阻塞起來(lái)進(jìn)入等待狀態(tài);(3)正在執(zhí)行的進(jìn)程調(diào)用了P原語(yǔ)操作,從而因資源不足而被阻塞;或調(diào)用了V原語(yǔ)操作激活了等待資源的進(jìn)程隊(duì)列;(4)執(zhí)行中的進(jìn)程提出I/O請(qǐng)求后被阻塞;(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完;以上都是CPU為不可剝奪方式下的引起進(jìn)程調(diào)度的原因。在CPU方式是可剝奪時(shí),還有下面的原因:(6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級(jí)變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級(jí),從而也將引起進(jìn)程調(diào)度。編程題:1已知C語(yǔ)言程序有主程序模塊prog.c,prog.h,其中調(diào)用了另一模塊subr.c,subr.h中的功能。試寫出一個(gè)可將這兩個(gè)模塊編譯成可

19、執(zhí)行文件pr1的Makefile.參考答案:pr1: prog.o subr.o gcc o pr1 prog.o subr.o prog.o: prog.c prog.h gcc c o prog.o prog.csubr.o: subr.c subr.h gcc c o subr.o subr.c2. (1) 編寫Makefile文件,最終的目標(biāo)文件為hello,交叉編譯器為arm-linux-gcc hello: main.o list.o symbol.o table.o gcc -o prog main.o list.o symbol.o table.omain.o: main.c

20、table.h symbol.h list.h gcc -c -o main.o main.clist.o: list.c list.h gcc -c -o list.o list.csymbol.o: symbol.c symbol.h gcc -c -o symbol.o symbol.ctable.o: table.c table.h symbol.h list.h gcc -c -o table.o table.cclean: rm hello *.o(2) 在目標(biāo)上上通過(guò)網(wǎng)絡(luò)文件系統(tǒng)掛載/mnt到宿主機(jī)上的/home/arm目錄。mount t nfs o noclock 192.1

21、68.0.10:/home/armtest/hello /mnt3. 在Linux操作系統(tǒng)下,編程實(shí)現(xiàn)以下功能(1)主程序hello.c(打印HELLO WORLD)(2)主程序通過(guò)頭文件hello.h調(diào)用message函數(shù)。(3)頭文件hello.h(聲明message函數(shù))(4)message函數(shù)由message.c定義(打印“This is a message!”)hello.c:# include # include # include # include hello.hint main (int argc,char *argv)printf(Hello World!n); messa

22、ge(); return 0; hello.h: void message(void); message.c: # include void message (void) printf(This is a message!n) 4. 閱讀下面的shell程序,寫出執(zhí)行結(jié)果Tom is my friend。 Jack is my friend Harry is my friend5. 對(duì)下列shell程序加注釋,并說(shuō)明程序的功能和調(diào)用方法。(1)程序注釋#!/bin/sh 定義實(shí)用的shell # /etc/rc.d/rc.httpd 注釋行,凡是以星號(hào)開(kāi)始的行均為注釋行。 # Start/st

23、op/restart the Apache web server. # To make Apache start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.httpd #case $1 in #case結(jié)構(gòu)開(kāi)始,判斷“位置參數(shù)”決定執(zhí)行的操作。本程序攜帶一個(gè)“位置參數(shù)”,即$1 start) #若位置參數(shù)為start/usr/sbin/apachectl start ; #啟動(dòng)httpd進(jìn)程stop) #若位置參數(shù)為stop/usr/sbin/apachectl stop ; #關(guān)閉ht

24、tpd進(jìn)程restart) #若位置參數(shù)為stop/usr/sbin/apachectl restart ; #重新啟動(dòng)httpd進(jìn)程*) #若位置參數(shù)不是start、stop或restart時(shí)echo usage $0 start|stop|restart ; #顯示命令提示信息:程序的調(diào)用方法esac #case結(jié)構(gòu)結(jié)束(2)程序的功能是啟動(dòng),停止或重新啟動(dòng)httpd進(jìn)程(3)程序的調(diào)用方式有三種:?jiǎn)?dòng),停止和重新啟動(dòng)。6.用Shell編程,判斷一個(gè)文件是不是字符設(shè)備文件,如果是將其復(fù)制到、dev目錄下。#!/bin/sh FILENAME= echo “Input file name:”

25、 read FILENAME if -c $FILENAME then cp $FILENAME /dev fi7. 用shell編程,求兩個(gè)數(shù)之和#/bin/bash typeset first secondread -p Input t e first number: firstread -p Input the second number: secondon個(gè)result=$first+$second echo result is : $result exit 08、設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1-user50,并沒(méi)有設(shè)置每個(gè)目錄的權(quán)限,其

26、中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀,寫,執(zhí)行、文件所有者所在組的權(quán)限為:讀,執(zhí)行。#!/bin/sh i=1while i -le 50 doif -d /userdata ;then mkdir -p /userdata/user$ichmod 754 /userdata/user$i echo user$ilet i = i + 1 (或i=$($i1) elsemkdir /userdata mkdir -p /userdata/user$i chmod 754 /userdata/user$iecho user$i let i = i + 1 (或i=$($i1)Fi Do

27、ne1.編寫一個(gè)主函數(shù),完成動(dòng)態(tài)配置10個(gè)struct test空間#include struct test int a10; char b20; int main()struct test *ptr=calloc(sizeof(struct test),10);9編寫一個(gè)程序,利用mmap()來(lái)讀取/etc/passwd文件的內(nèi)容#include #include #include#include #includemain() int fd; void *start; struct stat sb;fd=open(“/etc/passwd”,O_RDONLY);fstat(fd,&sb);

28、start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start= = MAP_FAILED) return;printf(“%s”,start);munma(start,sb.st_size); closed(fd);10. 用C語(yǔ)言編寫一個(gè)源程序main.c,實(shí)現(xiàn)以下功能。(1)打開(kāi)當(dāng)前目錄下的文件“test.txt”,如果沒(méi)有則創(chuàng)建該文件,并使其具有讀寫屬性Void main(void)int fid; fid = open(“./test.txt”,O_RDWR|O_CREAT); if(fid=-1)Printf(“ope

29、n or create error n”); exit(0); Close(fid); (2)編寫一個(gè)makefile實(shí)現(xiàn)自動(dòng)編譯,生成可執(zhí)行文件mainobjects = main.o exec = main all:$(objects) gcc o $(exec) $(objects)main.o:main.c gcc c main.c clean: rm r $(exec) $(objects)11.編寫程序,實(shí)現(xiàn)把一個(gè)文件的內(nèi)容復(fù)制到另一個(gè)文件中#include #include #include #include #include #include #define BUFFER_SI

30、ZE 1024 intmain(intargc,char*argv) intfrom_fd,to_fd; intbytes_read,bytes_write; charbufferBUFFER_SIZE; char*ptr; if(argc!=3) fprintf(stderr,Usage:%sfromfiletofilena,argv0);exit(1); if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open%sError:%sn,argv1,strerror(errno); exit(1); if(to_fd=open(argv2,

31、O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,Open%sError:%sn,argv2,strerror(errno);exit(1); /* 以下代碼是一個(gè)經(jīng)典的拷貝文件的代碼 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) if(bytes_read=-1)&(errno!=EINTR)break; elseif(bytes_read0) ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read) if(bytes_

32、write=-1)&(errno!=EINTR)break; elseif(bytes_write=bytes_read)break; elseif(bytes_write0) ptr+=bytes_write; bytes_read-=bytes_write if(bytes_write=-1)break; close(from_fd); close(to_fd); exit(0); 12從鍵盤上輸入兩個(gè)學(xué)生的基本信息,然后 寫入一個(gè)到文件中,最后讀出這兩個(gè)學(xué)生的數(shù)據(jù),并顯示在屏幕上。#include struct student char name10; Int age; ;int mai

33、n() FILE *fp; int i;struct student boya2, boyb2, *pp, *qq;if(fp = fopen(7-6.txt,w+)= NULL) printf(Can not open file, exit .n);return -1; pp = boya; qq = boyb; printf(please input data:n); for (i = 0; i name, &pp-age); pp = boya;fwrite(pp, sizeof(struct student), 2, fp); rewind(fp); fread(qq, sizeof(

34、struct student), 2, fp); printf(namettagen); for(i = 0; i name, qq-age); fclose(fp); return 0; 13父進(jìn)程和子進(jìn)程之間創(chuàng)建了一個(gè)管道,建立之間的通信 (1) 將數(shù)據(jù)緩沖區(qū)清0 memset(buf_r,0,sizeof(buf_r) (2) 創(chuàng)建管道 if(pipe(pipe_fd)0) (6) 關(guān)閉子進(jìn)程讀描述符 close(pipe_fd0) (7) 父進(jìn)程運(yùn)行控制語(yǔ)句 else if(pid0) (8) 關(guān)閉父進(jìn)程的讀描述符close(pipe_fd0) (9) 將數(shù)據(jù)寫入緩沖區(qū) if(writ

35、e(pipe_fd1,”hello”,5)!=-1) (10) 關(guān)閉父進(jìn)程寫描述符 close(pipe_fd1) 14編程創(chuàng)建一個(gè)特定的IPC結(jié)構(gòu)的關(guān)鍵字和一個(gè)信號(hào)量,建立此信號(hào)量的索引,修改索引指向的信號(hào)量的值,最后清除信號(hào)量。void main() key_t unique_key; int id; struct sembuf lock_it;union semun options; int i; unique_key = ftok(., a); id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);printf(semaphor

36、e id=%dn, id); options.val = 1; semctl(id, 0, SETVAL, options); i = semctl(id, 0, GETVAL, 0);printf(value of semaphore at index 0 is %dn, i);lock_it.sem_num = 0; lock_it.sem_op = -1; lock_it.sem_flg = IPC_NOWAIT; if (semop(id, &lock_it, 1) = -1) printf(can not lock semaphore.n);exit(1);i = semctl(id

37、, 0, GETVAL, 0);printf(value of semaphore at index 0 is %dn, i);semctl(id, 0, IPC_RMID, 0);15守護(hù)進(jìn)程編程。守護(hù)進(jìn)程實(shí)例包括兩部分:主程序test.c和初始化程序init.c。主程序每隔一分鐘向/tmp目錄中的日志test.log報(bào)告運(yùn)行狀態(tài);初始化程序中init_daemon函數(shù)負(fù)責(zé)生成守護(hù)進(jìn)程??梢岳胕nit_daemon函數(shù)生成自己的守護(hù)進(jìn)程。(1)init.c清單 #include #include #include #include #include void init_daemon(voi

38、d) int pid; int i; if(pid=fork() exit(0); else if(pid 0) exit(1); setsid(); if(pid=fork()exit(0); else if(pid 0) exit(1);for(i=0;i NOFILE;+i) close(i); chdir(/tmp); umask(0);return; (2) test.c清單 #include #include void init_daemon(void);main() FILE *fp; time_t t; init_daemon();while(1) sleep(60); if(

39、fp=fopen(test.log,a) =0) t=time(0); re at %sn,asctime(localtime(&t) ); fclose(fp); 編譯:gcc -g -o test init.c test.c 查看進(jìn)程:ps -ef 進(jìn)程的各種特性滿足上面的要求。16.實(shí)現(xiàn)父進(jìn)程和子進(jìn)程間的通信。程序包括;創(chuàng)建無(wú)名管道、子進(jìn)程向父進(jìn)程寫數(shù)據(jù)及關(guān)閉管道的讀端、父進(jìn)程從管道讀取子進(jìn)程寫的數(shù)據(jù)及關(guān)閉管理的寫端、讀有名管道和寫有名管道 #define INPUT 0 #define OUTPUT 1void main() int file_descriptors2; pid_t p

40、id; char buf256;int returned_count; pipe(file_descriptors);if(pid = fork() = -1) printf(Error in forkn); exit(1); if(pid = 0) printf(in the spawned (child) process.n);close(file_descriptorsINPUT);write(file_descriptorsOUTPUT, test data, strlen(test data); exit(0); else printf(in the spawning (parent

41、) process.n);close(file_descriptorsOUTPUT);returned_count = read(file_descriptorsINPUT, buf, sizeof(buf);printf(%d bytes of data received from spawned process: %sn,returned_count, buf); 17.在Linux系統(tǒng)下,有名管道可由兩種方式創(chuàng)建:命令行方式mknod系統(tǒng)調(diào)用和函數(shù)mkfifo。下面的兩種途徑都在當(dāng)前目錄下生成了一個(gè)名為myfifo的有名管道:方式一:mkfifo(myfifo,rw); 方式二:mkno

42、d myfifo p生成了有名管道后,就可以使用一般的文件I/O函數(shù)如open、close、read、write等來(lái)對(duì)它進(jìn)行操作。下面即是一個(gè)簡(jiǎn)單的例子,假設(shè)我們已經(jīng)創(chuàng)建了一個(gè)名為myfifo的有名管道。/* 進(jìn)程一:讀有名管道*/#include #include void main() FILE * in_file; int count = 1;char buf80; in_file = fopen(mypipe, r); if (in_file = NULL) printf(Error in fdopen.n); exit(1); while (count = fread(buf, 1,

43、 80, in_file) 0)printf(received from pipe: %sn, buf); fclose(in_file); /* 進(jìn)程二:寫有名管道*/#include #include void main() FILE * out_file; int count = 1;char buf80; out_file = fopen(mypipe, w); if (out_file = NULL) printf(Error opening pipe.); exit(1);sprintf(buf,this is test data for the named pipe exampl

44、en);fwrite(buf, 1, 80, out_file);fclose(out_file);8.8編寫一個(gè)程序,實(shí)現(xiàn)以下功能(1) 父進(jìn)程使用系統(tǒng)調(diào)用pipe()建立一個(gè)管道。(2) 創(chuàng)建兩個(gè)子進(jìn)程,分別向管道發(fā)下面一條信息后結(jié)束。This is the first message!This is the second message!(3) 父進(jìn)程從管道中分別接受兩個(gè)子進(jìn)程發(fā)來(lái)的消息并顯示該消息,然后父進(jìn)程結(jié)束。兩個(gè)子進(jìn)程的發(fā)送沒(méi)有先后要求。源程序如下:#include #include #include main()Int p1,p2,fd2; char outpipe50; ch

45、ar inpipe150=”This is the first message!”;char inpipe250=”This is the second message!”; pipe(fd); while(p1=fork()=-1);if (p1=0) lockf(fd1,1,0); write (fd1,inpipe1,50); exit(0); else while(p2=fork()=-1); if (p2=0) lockf(fd1,1,0);write(fd1,inpipe2,50); exit(0); else wait(0);read(fd0,putpipe,50); lockf

46、(fd1,0,0); printf(“Parent has received first message:n”);printf(“%sn”,outpipe); wait(0); read(fd0,outpipe,50);lockf(fd1,0,0); printf(“Parent has received second message:n”);printf(“$sn”,outpipe); exit(0); 例 8.15 信號(hào)發(fā)送及處理。實(shí)現(xiàn)一個(gè)信號(hào)接收程序 sigreceive(其中信號(hào)安裝由sigaction()實(shí)現(xiàn))。#include #include #includevoid new_o

47、p(int,siginfo_t *,void *); int main(int argc,char * * argv)struct sigaction act; int sig; sig=atoi(argv1); sigemptyset(&act.sa_mask);act.sa_flags=SA_SIGINFO; act.sa_sigaction=new_op; if(sigaction(sig,&act,NULL)0)printf(“install signal errorn”); While(i) sleep(2); printf(“wait for the signaln”); void

48、 new_op(int signum,siginfo_t * info,void * myact) printf(“receive signal %d”,signum);sleep(5); 8.10 本例使用FIFO進(jìn)行進(jìn)程間通信,程序lucy.c創(chuàng)建了FIFO write_fifo用于向程序Peter.c發(fā)送消息;peter.c程序創(chuàng)建了FIFO read_fifl用于向lucy.c發(fā)送消息。同事,lucy.c能夠通過(guò)打開(kāi)peter.c創(chuàng)建的FIFO來(lái)得到perter.c發(fā)來(lái)的消息,peter.c能夠通過(guò)打開(kāi)lucy.c創(chuàng)建的FIFO來(lái)得到lucy.c發(fā)來(lái)的消息。因此,lucy.c和pete

49、r.c就組成了一個(gè)簡(jiǎn)單的聊天模型。Lucy必須等到peter在線才能說(shuō)話,然后需要等待peter答應(yīng)才能繼續(xù)發(fā)話,就是一來(lái)一往的聊天模式,如果不聊了,輸入quit即可。/*下面是程序lucy.c*/#include #include #include#include #include #include#include int main(void) char write_fifo_name=”write-fifo”; char read_fifl_name=”read-fifo”;int write_fd,read_fd; char buf256; int len;struct stat sta

50、t_buf; int ret = mkfifo(write_fifo_name,S_IRUSR | S_IWUSR);if(ret=-1) printf(“Fail to creat FIFO %s:%s”,write_fifo_name,strerror(errno);exit(-1); write_fd=open(write_fifo_name,O_WRONLY);if(write_fd=-1) printf(“Fail to open FIFO”%s:%s”,write_fifo_name,strerror(errno); exit(-1); while(read_fd=open(read_fifo_name,O_RDONLY)=-1)sleep(1); while(1) printf(“Lucy:”); fg

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論