版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章1什么是嵌入式系統(tǒng)?它由哪幾部分組成? 嵌入式系統(tǒng)是一應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),切軟硬件可裁減,對(duì)功能、可靠性、成本、體積、功 耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。3個(gè)主要的組成部分:硬件、實(shí)時(shí)操作系統(tǒng)以及應(yīng)用軟件。硬件:包括處理器、存儲(chǔ)器(ROM RAM、輸入輸出設(shè)備、其他部分輔助系統(tǒng)等。 實(shí)時(shí)操作系統(tǒng):用于管理應(yīng)用軟件,并提供一種機(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)
2、對(duì)象的智能化功能。3列出 5中以上的嵌入式實(shí)時(shí)操作系統(tǒng)。 嵌入式實(shí)時(shí)操作系統(tǒng)是指操作系統(tǒng)本身要能在一個(gè)固定時(shí)限內(nèi)對(duì)程序調(diào)用(或外部事件)做出正確的反應(yīng) 亦即對(duì)時(shí)序與穩(wěn)定性的要求十分嚴(yán)格4嵌入式系統(tǒng)一般由幾層組成?簡(jiǎn)單介紹其作用。 嵌入式系統(tǒng)一般由硬件層、中間層、軟件層和功能層組成。:( 1 )硬件層 :由嵌入式微處理器、外圍電路和外設(shè)組成。(2)中間層 :硬件層與軟件層之間為中間層 . 作用:將系統(tǒng)軟件與底層硬件部分隔離,使得系統(tǒng)的底層設(shè) 備驅(qū)動(dòng)程序與硬件無(wú)關(guān)。( 3)軟件層 :主要是操作系統(tǒng),有的還包括文件系統(tǒng)、圖形用戶接口和網(wǎng)絡(luò)系統(tǒng)等。作用:操作系統(tǒng)是 一個(gè)標(biāo)準(zhǔn)的內(nèi)核 將中斷、 I/O 、
3、定時(shí)器等資源都封裝起來(lái),以方便用戶使用。( 4)功能層 :由基于操作系統(tǒng)開發(fā)的應(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í),要使用占先式( preemptive )內(nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就
4、緒總能得到 CPU 的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的 CPU 使用權(quán)就被剝奪了,或者說(shuō)被掛起了,那個(gè)高優(yōu) 先級(jí)的任務(wù)立刻得到了 CPU 的控制權(quán)。6簡(jiǎn)述什么是硬實(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ì)步驟有哪些?各部分主要工作
5、是什么? 嵌入式系統(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)的分類劃分,以決定哪些功能用硬件實(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.Linux 作為嵌入式操作系統(tǒng)的優(yōu)勢(shì)有哪些?(1)可應(yīng)用于多種硬件平臺(tái)。 Linux 已經(jīng)被移植到多種硬件平臺(tái),這對(duì)于經(jīng)費(fèi)、時(shí)間受限制的研究與開發(fā) 項(xiàng)目是很有吸引力的。原型可以在標(biāo)準(zhǔn)平臺(tái)上開發(fā)后移植到
6、具體的硬件。( 2) Linux 的高度模塊化使添 加部件非常容易。本身內(nèi)置網(wǎng)絡(luò)支持,而目前嵌入式系統(tǒng)對(duì)網(wǎng)絡(luò)支持要求越來(lái)越高。( 3)Linux 是一個(gè)和Unix 相似、以內(nèi)核為基礎(chǔ)的、具有完全的內(nèi)存訪問(wèn)控制,支持大量硬件等特性的一種通用操作系統(tǒng)。(4)Linux 可以隨意地配置,不需要任何的許可證或商家的合作關(guān)系。其程序源碼全部公開,這樣開發(fā)人員可 以對(duì)操作系統(tǒng)進(jìn)行定制,適應(yīng)其特殊需要。(5) Linux 帶有 Unix 用戶熟悉的完善的開發(fā)工具不但成熟完善,9簡(jiǎn)述 Linux 需要進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)。Linux 執(zhí)行進(jìn)程調(diào)度一般是在以下情況發(fā)生的:(1)正在執(zhí)行的進(jìn)程運(yùn)行完畢。(2)正在執(zhí)
7、行的進(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)度。 第三章二、綜合應(yīng)用題1、 已知C語(yǔ)言程序有主要程序模塊 prog.c、proc.h,其中調(diào)用了另一模塊subr.c、subr.h中的功能。試寫 出一個(gè)可將這兩個(gè)模塊編譯成
8、可執(zhí)行文件pr1的Makefile。pr1:prog.o subr.ogcc - o pr1 prog.o subr.oprog.o:prog.c prog.hgcc - c - o prog.o prog.csubr.o:subr.c subr.hgcc - c - o subr.o subr.c2、假定目錄/home/arm下有一個(gè)C語(yǔ)言程序,它由幾個(gè)單獨(dú)的文件組成,而這幾個(gè)文件又分別包含了其他文 件,如下表所示。完成下列任務(wù)(1 ) 編寫 Makefile 文件,最終的目標(biāo)文件為 hello ,交叉編譯器為 arm-linux-gcc 。hello:main.o list.o symbo
9、l.o table.oarm-linux-gcc - o hello main.o list.o symbol.o table.omain.o:main.c stdio.h table.h symbol.h list.harm-linux-gcc -c - o main.o main.clist.o:list.c list.h arm-linux-gcc - c - o list.o list.c symbol.o:symbol.c symbol.h arm-linux-gcc - c - o symbol.o symbol.c table.o:table.c table.h symbol.h
10、 list.h arm-linux-gcc - c - o table.o table.c clear: rm - f hello *.o( 2 )在目標(biāo)機(jī)上通過(guò)網(wǎng)絡(luò)文件系統(tǒng)掛載 /mnt 到宿主機(jī)上的 /home/arm 目錄。mount - t nfs - o nolock IP 地址:/home/arm /mnt3. 在Linux操作系統(tǒng)下,編程實(shí)現(xiàn)以下功能。(1) 主程序 hello.c( 打印“ hello world! ”)。(2) 主程序通過(guò)頭文件hello.h調(diào)用message函數(shù)。(3) message函數(shù)有 message.c 定義(打印“ This is a messag
11、e! ”)。/hello.h#ifndef HELLO_H#define HELLO_Hvoid message();#endif/message.c#include#include ” hello.h ”void message()printf( “this is a message! ” );/hello.c#include#include#include#include ” hello.h ”void main(int argc,char *argv)printf( “hello world!n” );message(); return 0; 第六章一簡(jiǎn)答題1、何為虛擬內(nèi)存?虛擬內(nèi)存的管
12、理有何作用?使用虛擬地址尋址整個(gè)系統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存。MMU便是實(shí)現(xiàn)虛擬內(nèi)存的必要條件。嵌入式處理器如果存在MMU,由于在MMUM備內(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)存空間。2、進(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ù)
13、段用來(lái)存放可執(zhí)行文件中已初始化全局變量,換句話說(shuō)就是存放程序靜態(tài)分配的變量和全局變量。BSS段:BSS段包含了程序中未初始化的全局變量,在內(nèi)存中BSS段全部置零。堆:堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。棧:棧是用戶存放程序臨 時(shí)創(chuàng)建的局部變量,也就是說(shuō)函數(shù)括弧“ ”中定義的變量除此以外,在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓 入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。3、簡(jiǎn)述內(nèi)核空間和用戶空間的區(qū)別。在Linux系統(tǒng)中,內(nèi)核在最高級(jí)執(zhí)行,也稱為“系統(tǒng)態(tài),在這一級(jí)任何操作都可以執(zhí)行。而應(yīng)用程序則 執(zhí)行在最低級(jí),即所謂的“用戶態(tài)”。在
14、這一級(jí)處理器禁止對(duì)硬件的直接訪問(wèn)和對(duì)內(nèi)存的未授權(quán)訪問(wèn)。模 塊是在所謂的“內(nèi)核空間”中運(yùn)行的,而應(yīng)用程序則是在“用戶空間”中運(yùn)行的。它們分別引用不同的內(nèi) 存映射,也就是程序代碼使用不同的“地址空間”。4、簡(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)程就可以 立刻看到其中的內(nèi)容。這塊共享虛擬內(nèi)存的頁(yè)面,出現(xiàn)在每一個(gè)共享該頁(yè)面的進(jìn)程的頁(yè)表中。但是它不需
15、要在所有進(jìn)程的虛擬內(nèi)存中都有相同的虛擬地址。5、簡(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)程。第七章二、編程題1、用C語(yǔ)言編寫一個(gè)源程序 main.c,實(shí)現(xiàn)以下功能。(1 )打開當(dāng)前目錄下的文件“ test.txt ”,如果沒(méi)有則創(chuàng)建該文件,并使其具體讀寫屬性。Void main(void)int fid;fid = open( “./test.txt”,O_RDWR|O_CREAT);
16、if(fid=-1) Printf( “open or create errorn”);exit(0); Close(fid); (2)編寫一個(gè) makefile 實(shí)現(xiàn)自動(dòng)編譯,生成可執(zhí)行文件 main 。objects = main.oexec = mainall:$(objects)gcc - o $(exec) $(objects)main.o:main.cgcc - c main.cclean:rm - r $(exec) $(objects)2、編寫一個(gè)程序?qū)崿F(xiàn)把一個(gè)文件內(nèi)容復(fù)制到另一個(gè)文件中。2. 參考程序 :#include #include #include #include
17、#include #include #define BUFFER_SIZE 1024int main(int argc,char *argv)int from_fd,to_fd;int bytes_read,bytes_write;char bufferBUFFER_SIZE;char *ptr;if(argc!=3) fprintf(stderr,Usage:%s fromfile tofilena,argv0);exit(1);/* 打開源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open %s Error:%sn,a
18、rgv1,strerror(errno); exit(1); /* 創(chuàng)建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,Open %s Error:%sn,argv2,strerror(errno);exit(1);/* 以下代碼是一個(gè)經(jīng)典的拷貝文件的代碼 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)發(fā)生讀錯(cuò)誤 ,退出循環(huán) */若寫錯(cuò)誤 ,退出循環(huán) */讀寫字節(jié)不等退出循環(huán) */if(bytes_read=-1)&(err
19、no!=EINTR) break; /* else if(bytes_read0) ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read) if(bytes_write=-1)&(errno!=EINTR)break; /* /* 寫完了所有讀的字節(jié) */ else if(bytes_write=bytes_read) break;/* else if(bytes_write0) /* 只寫了一部分 , 繼續(xù)寫 */ ptr+=bytes_write;bytes_read-=bytes_write; if(bytes_write=-1)
20、break; /*寫的時(shí)候發(fā)生的致命錯(cuò)誤 */ close(from_fd); close(to_fd); exit(0);4、從鍵盤上輸入兩個(gè)學(xué)生的基本信息,然后寫入一個(gè)到文件中,最后讀出這兩個(gè)學(xué)生的數(shù)據(jù),并顯示在 屏幕上#include struct student char name10;int age; ;int main() 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);retur
21、n -1; pp = boya;qq = boyb;printf(please input data:n); /輸入學(xué)生信息 for (i = 0; i name, &pp-age);pp = boya;fwrite(pp, sizeof(struct student), 2, fp); /把學(xué)生信息寫入文件rewind(fp); / 重定位文件fread(qq, sizeof(struct student), 2, fp); /從文件中讀取學(xué)生信息printf(namettagen);for(i = 0; i name, qq-age);fclose(fp);return 0;4、編寫一個(gè)對(duì)
22、文件加寫入鎖的程序。寫入鎖是互斥鎖,一個(gè)時(shí)刻只能有一個(gè)寫入鎖存在。并在兩個(gè)終端分 別運(yùn)行,驗(yàn)證先運(yùn)行的那個(gè)終端能成功上鎖,后運(yùn)行的那個(gè)無(wú)效。/*fcntl_write.c 測(cè)試文件寫入鎖主函數(shù)部分 */#i nclude unistd.h#i nclude sys/file.h#i nclude sys/types.h#i nclude sys/stat.h#i nclude stdio.h#i nclude stdlib.h/*lock_set 函數(shù) */void lock_set(int fd, int type)struct flock lock;lock.l_whence = SEEK
23、_SET;/ 賦值 lock 結(jié)構(gòu)體 lock.l_start = 0;lock.l_len =0;while(1) lock.l_type = type;/* 根據(jù)不同的 type 值給文件上鎖或解鎖 */ if(fcntl(fd, F_SETLK, &lock) = 0)if( lock.l_type = F_RDLCK ) printf(read lock set by %d/n,getpid();else if( lock.l_type = F_WRLCK ) printf(write lock set by %d/n,getpid();else if( lock.l_type = F
24、_UNLCK ) printf(release lock by %d/n,getpid(); return;/* 判斷文件是否可以上鎖 */ fcntl(fd, F_GETLK,&lock);/* 判斷文件不能上鎖的原因 */ if(lock.l_type != F_UNLCK) /*/ 該文件已有寫入鎖 */if( lock.l_type = F_RDLCK )printf(read lock already set by %d/n,lock.l_pid); /* 該文件已有讀取鎖 */else if( lock.l_type = F_WRLCK )printf(write lock alr
25、eady set by %d/n,lock.l_pid); getchar(); int main(void) int fd;/* 首先打開文件 */ fd=open(hello,O_RDWR | O_CREAT, 0666); if(fd 0)perror(open);exit(1);/* 給文件上寫入鎖 */ lock_set(fd, F_WRLCK); getchar();/* 給文件接鎖 */ lock_set(fd, F_UNLCK); getchar(); close(fd);exit(0); 第八章三、編程題1、編程創(chuàng)建一個(gè)特定的IPC結(jié)構(gòu)的關(guān)鍵字和一個(gè)信號(hào)量,建立此信號(hào)量的索引
26、,修改索引指向的信號(hào)量的 值,最后清除信號(hào)量(注:利用函數(shù) frok生成上文所說(shuō)的唯一 IPC關(guān)鍵字。)void main() key_t unique_key; /* 定義一個(gè) IPC 關(guān)鍵字 */int id;struct sembuf lock_it;union semun options;int i;unique_key = ftok(., a); /*生成關(guān)鍵字 字符 a 是一個(gè)隨機(jī)種子 */* 創(chuàng)建一個(gè)新的信號(hào)量集合 */id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);printf(semaphore id=%dn,
27、id);options.val = 1; /* 設(shè)置變量值 */semctl(id, 0, SETVAL, options); /*設(shè)置索引 0 的信號(hào)量 */* 打印出信號(hào)量的值 */i = semctl(id, 0, GETVAL, 0);printf(value of semaphore at index 0 is %dn, i);/* 下面重新設(shè)置信號(hào)量 */lock_it.sem_num = 0; /* 設(shè)置哪個(gè)信號(hào)量 */lock_it.sem_op = -1; /* 定義操作 */lock_it.sem_flg = IPC_NOWAIT; /*操作方式 */if (semop(i
28、d, &lock_it, 1) = -1) printf(can not lock semaphore.n);exit(1);i = semctl(id, 0, GETVAL, 0); printf(value of semaphore at index 0 is %dn, i); /* 清除信號(hào)量 */ semctl(id, 0, IPC_RMID, 0);/temp2、守護(hù)進(jìn)程編程。 守護(hù)進(jìn)程實(shí)例包括兩部分: 主程序 test.c 和初始化程序 init.c 。主程序每隔一分鐘向 目錄的日志 test.log 報(bào)告運(yùn)行狀態(tài);初始化程序中的 init_daemon 函數(shù)負(fù)責(zé)生成守護(hù)進(jìn)程??梢?/p>
29、利用 init_daemon 函數(shù)生成自己的守護(hù)進(jìn)程。void init_daemon( void )int pid; int i;if (pid=fork()exit(0); / 是父進(jìn)程,結(jié)束父進(jìn)程else if (pid 0)exit(1); /fork 失敗,退出setsid();if (pid=fork()exit(0); / 是第一子進(jìn)程,結(jié)束第一子進(jìn)程else if (pid 0)exit(1); /fork 失敗,退出for (i= 0;i NOFILE;+i) / 關(guān)閉打開的文件描述符 close(i);chdir( /tmp ); / 改變工作目錄到 /tmp umask(
30、 0); / 重設(shè)文件創(chuàng)建掩模return ; 2 test.c 清單#include #include void init_daemon( void ); / 守護(hù)進(jìn)程初始化函數(shù) main() FILE *fp;time_t t;init_daemon(); / 初始化為 Daemonwhile ( 1)/ 每隔一分鐘向 test.log 報(bào)告運(yùn)行狀態(tài) sleep( 60); / 睡眠一分鐘 if (fp=fopen( test.log , a ) = 0) t=time(0);fprintf(fp,Im here at %sn ,asctime(localtime(&t) );fclose
31、(fp); 3、編程實(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)閉管道的寫端、讀有名管道和寫有名管道。void main() int file_descriptors2;/* 定義子進(jìn)程號(hào) */pid_t pid;char buf256; int returned_count;/* 創(chuàng)建無(wú)名管道 */ pipe(file_descriptors);/* 創(chuàng)建子進(jìn)程 */ if(pid = fork() = -1) printf(Error in forkn);exit(1);/* 執(zhí)行子進(jìn)程 */if(pid =
32、 0) printf(in the spawned (child) process.n);/* 子進(jìn)程向父進(jìn)程寫數(shù)據(jù) 關(guān)閉管道的讀端 */ close(file_descriptorsINPUT);write(file_descriptorsOUTPUT, test data, strlen(test data);exit(0); else /* 執(zhí)行父進(jìn)程 */printf(in the spawning (parent) process.n);/* 父進(jìn)程從管道讀取子進(jìn)程寫的數(shù)據(jù) 關(guān)閉管道的寫端 */ close(file_descriptorsOUTPUT);returned_count
33、 = read(file_descriptorsINPUT, buf, sizeof(buf); printf(%d bytes of data received from spawned process: %sn, returned_count, buf);在 Linux 系統(tǒng)下,有名管道可由兩種方式創(chuàng)建,命令行方式 mknod 系統(tǒng)調(diào)用和函數(shù) mkfifo 。 下面的兩種途徑都在當(dāng)前目錄下生成了一個(gè)名為 myfifo 的有名管道, 方式一, mkfifo(myfifo,rw);方式二, mknod myfifo p生成了有名管道后,就可以使用一般的文件 I/O 函數(shù)如 open、close
34、 、 read 、write 等來(lái)對(duì)它 進(jìn)行操作。下面即是一個(gè)簡(jiǎn)單的例子,假設(shè)我們已經(jīng)創(chuàng)建了一個(gè)名為 myfifo 的有名管道。/* 進(jìn)程一,讀有名管道 */#define INPUT 0#define OUTPUT 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, 80, in_file) 0) printf(re
35、ceived 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 examplen); fwrite(buf, 1, 80, ou
36、t_file);fclose(out_file); 第十章3預(yù)處理、編譯、匯編和連接4. step next1、下列提法中,屬于 ifconfig 命令作用范圍的是( B)B、配置網(wǎng)卡的IP地址2、在FTP協(xié)議中,控制連接是由(B)主動(dòng)建立的。B、客戶端3、當(dāng)與某遠(yuǎn)程網(wǎng)絡(luò)連接不上時(shí),需要跟蹤路由查看,以便了解在網(wǎng)絡(luò)的什么位 置出現(xiàn)了問(wèn)題,滿足該目的命令是( traceroute )。5、局域網(wǎng)的網(wǎng)絡(luò)地址 /24 ,局域網(wǎng)絡(luò)連接其它網(wǎng)絡(luò)的網(wǎng)關(guān)地址是 。主機(jī)0 訪問(wèn)/24 網(wǎng)絡(luò)時(shí),其路由設(shè)置正確的是( B )。B
37、) route add - net gw netmask 55 metric 1 5、如果想配置一臺(tái)匿名FTP服務(wù)器,應(yīng)修改(/etc/ftpusers )。& 要配置NFS艮務(wù)器,在服務(wù)器端主要配置(/etc/exports )文件。7、在TCP/IP模型中,應(yīng)用層包含了所有的高層協(xié)議,在下列的一些應(yīng)用協(xié)議中, (B)能夠?qū)崿F(xiàn)本地與遠(yuǎn)程主機(jī)之間的文件傳輸工作。B 、 Ftp 8、DNS域名系統(tǒng)主要負(fù)責(zé)主機(jī)名和(IP地址)之間的解析。10、請(qǐng)選擇正確的命令( B) ,完成加載 NFS Server svr.server.n
38、et 的 /home/nfs 到 /home2。B.、 mount -t -s nfs /home/nfs /home2三、選擇題1、一般可以用(make實(shí)現(xiàn)自動(dòng)編譯。2假使當(dāng)前目錄下有文件 Makefile, 其內(nèi)容如下?,F(xiàn)在執(zhí)行命令 make clear, 實(shí)際 執(zhí)行的命令是(rm - f pr1 *.o)。3、嵌入式系統(tǒng)應(yīng)用軟件一般在宿主機(jī)上開發(fā),在目標(biāo)機(jī)上運(yùn)行,因此需要的一 個(gè)(交叉編譯)環(huán)境。4、假設(shè)用 vi 編輯器編寫了一個(gè)腳本文件 shell.sh, 現(xiàn)想將該文件名稱修改為 shell2.sh ,( mv shell.sh shell2.sh )命令
39、可以實(shí)現(xiàn)。5、在使用GC編輯器的過(guò)程中,(-o)選項(xiàng)可用來(lái)指定生成的目標(biāo)文件名。6、假設(shè)當(dāng)前目錄下有文件 Makefile, 其內(nèi)容如下?,F(xiàn)在執(zhí)行命令 make subr.o , 實(shí)際執(zhí)行的命令是(gcc - c - o subr.o subr.c )。7、 為了使生成的目標(biāo)文件能夠用于 GD調(diào)試,在編譯時(shí)GC應(yīng)使用(-g)選項(xiàng)。8、存盤并退出 vi 的指令是( wq)。9、在Linux下使用GC編譯器時(shí),有命令gcc - g test.c - o test,其中參數(shù)-g 的作用是(生成文件包含調(diào)試信息)。10、fstab 文件存放在( /ect )目錄中。11、init 啟動(dòng)進(jìn)程需要讀取(
40、/etc/inittab )配置文件。 第四章1. LINUX 支持網(wǎng)絡(luò)文件系統(tǒng) NFS, (mount -t nfs 192.168.14/opt/sirnfs/mnt/sirnfs )命令實(shí)現(xiàn)了將位于 機(jī)器上的 /opt/sirnfs 目錄掛載 到本機(jī) /mnt/sirnfs 下。2. 以下敘述中正確的是( C)C、在嵌入式系統(tǒng)開發(fā)中,通常采用的是交叉編譯器。3. 以下做法不利于嵌入式應(yīng)用軟件的移植的是D 。D)在數(shù)據(jù)類型上,盡量直接使用C語(yǔ)言的數(shù)據(jù)類型4. 如果Boot Loader、內(nèi)核、啟動(dòng)參數(shù)以及其他的系統(tǒng)映像四部分在固態(tài)存儲(chǔ)設(shè) 備上分別獨(dú)立存放,則其存儲(chǔ)結(jié)
41、構(gòu)的分配順序應(yīng)當(dāng)是( Bootloader 、啟動(dòng)參數(shù)、 內(nèi)核、文件系統(tǒng))。5. Boot Loader的stage2通常使用C語(yǔ)言實(shí)現(xiàn),以完成復(fù)雜的功能,并增加可讀 性和可移植性,以下哪一步驟屬于stage2的內(nèi)容:(D)D . 將 kernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中&在Linux 2.4或者2.6內(nèi)核中,和AR體系結(jié)構(gòu)相關(guān)的中斷處理程序的 C代碼在 源碼樹的 (arch/arm/kernel/irq.c) 文件中7、 下面對(duì)于BootLoader的描述不正確的是(C)C、BootLoader的兩種模式對(duì)開發(fā)人員沒(méi)有意義8、( make menuconfig)命令以文本菜單方式界面配置
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年攪拌車混凝土運(yùn)輸質(zhì)量合同
- 2024-2030年硼鐵行業(yè)市場(chǎng)發(fā)展分析及前景趨勢(shì)與投資研究報(bào)告
- 2024-2030年永磁行星減速起動(dòng)機(jī)驅(qū)動(dòng)軸總成公司技術(shù)改造及擴(kuò)產(chǎn)項(xiàng)目可行性研究報(bào)告
- 2024-2030年新版中國(guó)膠柄鋼絲鉗項(xiàng)目可行性研究報(bào)告
- 2024-2030年新版中國(guó)電動(dòng)三輪自行車項(xiàng)目可行性研究報(bào)告
- 2024-2030年新版中國(guó)刀合金刀項(xiàng)目可行性研究報(bào)告
- 2024年度工程分包合同條款及標(biāo)的詳述
- 2024-2030年全球及中國(guó)鈦酸鉍行業(yè)產(chǎn)銷需求及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年全球及中國(guó)膽道活檢鉗行業(yè)發(fā)展動(dòng)態(tài)及應(yīng)用前景預(yù)測(cè)報(bào)告
- 2024-2030年全球及中國(guó)推狗椅行業(yè)營(yíng)銷策略及投資效益預(yù)測(cè)報(bào)告
- 推拿手法完整版本
- 運(yùn)動(dòng)與健康(山東大學(xué))學(xué)堂云網(wǎng)課答案
- 五育并舉-同心筑夢(mèng)家長(zhǎng)會(huì)課件
- 物業(yè)工程能耗管控方案
- 數(shù)字孿生應(yīng)用技術(shù)員職業(yè)技能競(jìng)賽試題及答案
- 帕金森病機(jī)制
- 2024航空工業(yè)集團(tuán)校園招聘筆試參考題庫(kù)附帶答案詳解
- 《中藥鑒定技術(shù)》課件-甘草的鑒定
- 燃?xì)庋簿€員專業(yè)知識(shí)考試題庫(kù)(附答案)
- 《如何做一名好教師》課件
- CORELDRAW 室內(nèi)平面布置圖課件
評(píng)論
0/150
提交評(píng)論