linux系統(tǒng)編程試卷(答案)_第1頁(yè)
linux系統(tǒng)編程試卷(答案)_第2頁(yè)
linux系統(tǒng)編程試卷(答案)_第3頁(yè)
linux系統(tǒng)編程試卷(答案)_第4頁(yè)
linux系統(tǒng)編程試卷(答案)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(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áng)教育嵌入式培訓(xùn)系統(tǒng)編程部分測(cè)試試題注:考試為閉卷,程序題需上機(jī)操作運(yùn)行出結(jié)果,考試時(shí)間為120分鐘一:選擇題(本題共4小題,每題3分共12分)1)下列不是Linux系統(tǒng)進(jìn)程類型的是( D ) A 交互進(jìn)程 B 批處理進(jìn)程 C 守護(hù)進(jìn)程 D 就緒進(jìn)程(進(jìn)程狀態(tài))2)以下對(duì)信號(hào)的理解不正確的是( B ) A 信號(hào)是一種異步通信方式B 信號(hào)只用在用戶空間進(jìn)程通信,不能和內(nèi)核空間交互C 信號(hào)是可以被屏蔽的D 信號(hào)是通過(guò)軟中斷實(shí)現(xiàn)的3)進(jìn)程有三種狀態(tài)( C )A 準(zhǔn)備態(tài)、執(zhí)行態(tài)和退出態(tài) B 精確態(tài)、模糊態(tài)和隨機(jī)態(tài)C 運(yùn)行態(tài)、就緒態(tài)和等待態(tài) D 手工態(tài)、自動(dòng)態(tài)和自由態(tài)4)不是進(jìn)程和程序的區(qū)別( B)A

2、 程序是一組有序的靜態(tài)指令,進(jìn)程是一次程序的執(zhí)行過(guò)程B 程序只能在前臺(tái)運(yùn)行,而進(jìn)程可以在前臺(tái)或后臺(tái)運(yùn)行C 程序可以長(zhǎng)期保存,進(jìn)程是暫時(shí)的D 程序沒(méi)有狀態(tài),而進(jìn)程是有狀態(tài)的二:填空題(本題共6小題,2)、3)兩題每空四分,其余每空一分。共23分)1)列舉八種常見(jiàn)的進(jìn)程間通信方式無(wú)名管道、有名管道、消息隊(duì)列、信號(hào)量、共享內(nèi)存、信號(hào)、套接字網(wǎng)絡(luò)上兩個(gè)主機(jī)的進(jìn)程間通信方式為套接字2)命名管道比無(wú)名管道的優(yōu)勢(shì)提供了一個(gè)可以訪問(wèn)的路徑名,實(shí)現(xiàn)沒(méi)親緣關(guān)系的進(jìn)程間通信3)消息隊(duì)列比命名管道和無(wú)名管道的優(yōu)勢(shì)可以按類型實(shí)現(xiàn)消息的隨機(jī)查詢,沒(méi)必要先進(jìn)先出4)按照邏輯結(jié)構(gòu)不同進(jìn)行數(shù)據(jù)庫(kù)劃分,Sqlite 數(shù)據(jù)庫(kù)屬于哪

3、一類關(guān)系型數(shù)據(jù)庫(kù)5)在C語(yǔ)言中操作sqlite數(shù)據(jù)庫(kù),常用的2中方式是sqlite_exec(回調(diào))、sqlite_gettable(非回調(diào))6)列舉四種進(jìn)程調(diào)度算法先來(lái)先調(diào)度(FCFS)、短進(jìn)程優(yōu)先調(diào)度(SPF)、高優(yōu)先級(jí)調(diào)度(HPF)、時(shí)間片輪轉(zhuǎn)調(diào)度三:?jiǎn)柎痤}(本題共7題,每題5分,共35分)1)什么是系統(tǒng)調(diào)用?系統(tǒng)調(diào)用是通過(guò)什么方式陷入內(nèi)核態(tài)的?請(qǐng)寫出你對(duì)系統(tǒng)調(diào)用的理解。什么是文件I/O和標(biāo)準(zhǔn)I/O庫(kù)?文件I/O和標(biāo)準(zhǔn)I/O庫(kù)的區(qū)別?系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組特殊接口,用戶程序可以通過(guò)這組接口獲得操作系統(tǒng)內(nèi)核提供的服務(wù)。系統(tǒng)調(diào)用是通過(guò)軟件中斷方式陷入內(nèi)核的linux的文

4、件I/O是由操作系統(tǒng)提供的基本IO服務(wù), 標(biāo)準(zhǔn)I/O庫(kù)通過(guò)封裝系統(tǒng)調(diào)用,提供了一個(gè)到底層I/O的接口。 標(biāo)準(zhǔn)IO默認(rèn)采用了緩沖機(jī)制,還創(chuàng)建了一個(gè)包含文件和緩沖區(qū)相關(guān)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu);文件I/O一般沒(méi)有采用緩沖模式,需要自己創(chuàng)建緩沖區(qū)。一種是標(biāo)準(zhǔn)庫(kù)封裝系統(tǒng)調(diào)用而成,更高級(jí) ,一種是系統(tǒng)提供的,比較低級(jí);標(biāo)準(zhǔn)IO可移植性高、文件I/O可移植性低。2)什么是進(jìn)程?用fork()創(chuàng)建一個(gè)子進(jìn)程時(shí),系統(tǒng)會(huì)做什么工作進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配的單位,不僅是系統(tǒng)內(nèi)部獨(dú)立運(yùn)行的實(shí)體也是獨(dú)立競(jìng)爭(zhēng)資源的實(shí)體。用fork()時(shí)系統(tǒng)會(huì)分配子進(jìn)程一個(gè)ID號(hào) 然后繼承父進(jìn)程

5、的地址空間,包括進(jìn)程上下文 進(jìn)程堆棧 打開的文件描述符等等,他就是父進(jìn)程的一個(gè)復(fù)制品。3)進(jìn)程和線程有什么區(qū)別?每個(gè)獨(dú)立的進(jìn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在進(jìn)程程中,由進(jìn)程提供多個(gè)線程執(zhí)行的控制。 進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú) 立單位. 線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.  一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程

6、之間可以并發(fā)執(zhí)行。4)什么是線程的互斥和同步,程序應(yīng)怎樣寫才能達(dá)到互斥或同步? 互斥:是指某一資源同時(shí)只允許一個(gè)訪問(wèn)者對(duì)其進(jìn)行訪問(wèn),具有唯一性和排它性。但互斥無(wú)法限制訪問(wèn)者對(duì)資源的訪問(wèn)順序,即訪問(wèn)是無(wú)序的。 同步:是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過(guò)其它機(jī)制實(shí)現(xiàn)訪問(wèn)者對(duì)資源的有序訪問(wèn)。在大多數(shù)情況下,同步已經(jīng)實(shí)現(xiàn)了互斥,特別是所有寫入資源的情況必定是互斥的。少數(shù)情況是指可以允許多個(gè)訪問(wèn)者同時(shí)訪問(wèn)資源。在寫程序時(shí)可以用互斥鎖和信號(hào)量實(shí)現(xiàn)線程同步 ,一個(gè)線程訪問(wèn)共享資源時(shí)給這個(gè)資源上鎖其他線程就不能訪問(wèn)了直到上鎖的進(jìn)程釋放互斥鎖為止。5)什么是僵尸進(jìn)程?孤兒進(jìn)程?守護(hù)進(jìn)程? 僵尸進(jìn)程:僵尸進(jìn)程是

7、指它的父進(jìn)程已經(jīng)退出(父進(jìn)程沒(méi)有等待(調(diào)用wait/waitpid)它),而該進(jìn)程dead之后沒(méi)有進(jìn)程接受,就成為僵尸進(jìn)程,也就是(zombie)進(jìn)程。孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。守護(hù)進(jìn)程:是指在UNIX或其他多任務(wù)操作系統(tǒng)中在后臺(tái)執(zhí)行的電腦程序,并不會(huì)接受電腦用戶的直接操控。此類程序會(huì)被以進(jìn)程的形式初始化。守護(hù)進(jìn)程程序的名稱通常以字母“d”結(jié)尾:例如,syslogd就是指管理系統(tǒng)日志的守護(hù)進(jìn)程。通常,守護(hù)進(jìn)程沒(méi)有任何存在的父進(jìn)程(即PPID=1),

8、且在UNIX系統(tǒng)進(jìn)程層級(jí)中直接位于init之下。守護(hù)進(jìn)程程序通常通過(guò)如下方法使自己成為守護(hù)進(jìn)程:對(duì)一個(gè)子進(jìn)程調(diào)用fork,然后使其父進(jìn)程立即終止,使得這個(gè)子進(jìn)程能在init下運(yùn)行。這種方法通常被稱為“脫殼”6)有3個(gè)線程:A、B、C,現(xiàn)要求A先執(zhí)行,然后B再執(zhí)行,最后C再執(zhí)行,之后A->B->C循環(huán)執(zhí)行,請(qǐng)說(shuō)出大體的思路?創(chuàng)建3個(gè)信號(hào)量sem_A、sem_B、sem_C,分別用來(lái)給A、B、C 3個(gè)線程,啟動(dòng)sem_A信號(hào)量的初始值為1,其余2個(gè)信號(hào)量初始值為0,當(dāng)主線程創(chuàng)建3個(gè)子線程后,因?yàn)閟em_A的值大于0,所以只有A線程執(zhí)行相關(guān)的代碼,B、C線程堵塞在對(duì)sem_B、sem_C

9、信號(hào)量的p操作;當(dāng)A線程執(zhí)行完相應(yīng)的代碼后,給sem_B信號(hào)量加1,之后B線程開始執(zhí)行相關(guān)操作,在此時(shí)A線程堵塞在對(duì)sem_A信號(hào)量的p操作,C線程繼續(xù)堵塞;當(dāng)B線程執(zhí)行完畢相關(guān)操作后,給sem_C進(jìn)行V操作,B線程堵塞,C線程執(zhí)行相關(guān)操作;以上是從A->B->C線程執(zhí)行的流程.7)exit()、_exit()和return()的區(qū)別?exit():結(jié)束當(dāng)前的進(jìn)程,并且會(huì)刷新緩存區(qū),關(guān)閉沒(méi)有關(guān)閉的文件等_exit():結(jié)束當(dāng)前的進(jìn)程,不對(duì)緩存區(qū)刷新return:1:在main函數(shù)中會(huì)結(jié)束當(dāng)前進(jìn)程2:在子函數(shù)中,會(huì)返回調(diào)用當(dāng)前函數(shù)的調(diào)用位置,進(jìn)程從下個(gè)C語(yǔ)句開始執(zhí)行四:程序題(本小題

10、共3題,每題10分 共30分)1) 用多線程、信號(hào)量實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的模擬,倉(cāng)庫(kù)容量為10,倉(cāng)庫(kù)中開始有3件產(chǎn)品,消費(fèi)者每3秒消費(fèi)一件產(chǎn)品,生產(chǎn)者每?jī)擅肷a(chǎn)一個(gè)產(chǎn)品,生產(chǎn)者和消費(fèi)者不能同時(shí)進(jìn)入倉(cāng)庫(kù)(需要互斥)/信號(hào)量-線程間通信/“生產(chǎn)者消費(fèi)者” 問(wèn)題#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>#include<pthread.h>#definemsleep(x)usleep(x*1000)#define PRODUCT_SPEE

11、D3/生產(chǎn)速度#define CONSUM_SPEED1/消費(fèi)速度#define INIT_NUM3/倉(cāng)庫(kù)原有產(chǎn)品數(shù)#defineTOTAL_NUM10/倉(cāng)庫(kù)容量sem_t p_sem, c_sem, sh_sem;int num=INIT_NUM;void product(void)/生產(chǎn)產(chǎn)品sleep(PRODUCT_SPEED);int add_to_lib()/添加產(chǎn)品到倉(cāng)庫(kù)num+;/倉(cāng)庫(kù)中的產(chǎn)品增加一個(gè)msleep(500);return num;void consum()/消費(fèi)sleep(CONSUM_SPEED);int sub_from_lib()/從倉(cāng)庫(kù)中取出產(chǎn)品num-;

12、 /倉(cāng)庫(kù)中的產(chǎn)品數(shù)量減一msleep(500);return num;void *productor(void *arg)/生產(chǎn)者線程while(1)sem_wait(&p_sem);/生產(chǎn)信號(hào)量減一product();/ 生產(chǎn)延時(shí)sem_wait(&sh_sem);/這個(gè)信號(hào)量是用來(lái)互斥的printf("push into! tatol_num=%dn",add_to_lib();sem_post(&sh_sem);sem_post(&c_sem); /消費(fèi)信號(hào)量加一void *consumer(void *arg)/消費(fèi)者線程while(

13、1)sem_wait(&c_sem); /消費(fèi)者信號(hào)量減一sem_wait(&sh_sem);printf("pop out! tatol_num=%dn",sub_from_lib();sem_post(&sh_sem);sem_post(&p_sem);/生產(chǎn)者信號(hào)量加一consum();/消費(fèi)延時(shí)int main()pthread_t tid1,tid2;sem_init(&p_sem,0,TOTAL_NUM-INIT_NUM);sem_init(&c_sem,0,INIT_NUM);sem_init(&sh_s

14、em,0,1);pthread_create(&tid1,NULL,productor,NULL);pthread_create(&tid2,NULL,consumer,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;2) 編寫一個(gè)多線程的程序:要求:1、 創(chuàng)建2個(gè)子線程,主進(jìn)程要傳遞3個(gè)參數(shù)給線程1,傳遞另一個(gè)參數(shù)給線程2;2、 線程1、線程2中對(duì)每個(gè)傳給線程的參數(shù)加1,等線程都執(zhí)行完畢后,進(jìn)程打印出四個(gè)參數(shù)的值。3、 傳給線程1參數(shù)的值必需要能夠改變,傳給線程2參數(shù)的值必需不能改變#include

15、 <stdio.h>#include <unistd.h>#include <pthread.h>typedef structint A;int B;int C;DATA;/*傳參方法1*/void *thread_1(void *arg)DATA *rec;sleep(1);rec = (DATA *)arg;rec->A += 1;rec->B += 1;rec->C += 1;return NULL;/*傳參方法2*/void *thread_2(void * arg)int rec = 0;sleep(1);rec = (int )

16、(arg);rec +;return NULL;int main(int argc, char *argv)pthread_t tid1,tid2;DATA test;int D = 100;test.A = 100;test.B = 100;test.C = 100;/*創(chuàng)建兩個(gè)線程*/pthread_create(&tid1, NULL, (void *)thread_1, (void *)(&test); pthread_create(&tid2, NULL, (void *)thread_2, (void *)D);pthread_join(tid1, NULL

17、);pthread_join(tid2, NULL);printf("A=%dn", test.A);printf("B=%dn", test.B);printf("C=%dn", test.C);printf("D=%dn", D);return 0;3) 編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信: 使用系統(tǒng)調(diào)用pipe()建立一條管道線,2個(gè)子進(jìn)程分別向管道各寫一句話: Child process 1 is sending a message!Child process 2 is sending a message!

18、而父進(jìn)程則從管道中讀出來(lái)自于2個(gè)子進(jìn)程的信息,顯示在屏幕上。 要求:父進(jìn)程先接收子進(jìn)程P1發(fā)來(lái)的消息,然后再接收子進(jìn)程P2發(fā)來(lái)的消息。 #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int main(int argc, char *argv)int fd2;pid_t pid;pid_t pid_sec;char buf7;pipe(fd);if(pid = fork()<0)printf("fork error!");exit(1);else if(pid = 0)close(fd0);write(fd1,"first1",7);close(fd1);exit(0);elseif(pid_sec = fork()&

溫馨提示

  • 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)論