Linux高級編程筆試題答案_第1頁
Linux高級編程筆試題答案_第2頁
Linux高級編程筆試題答案_第3頁
Linux高級編程筆試題答案_第4頁
Linux高級編程筆試題答案_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、高級編程筆試題答案一、 選擇題1. 在網(wǎng)絡(luò)字節(jié)序中,所謂”小端”(little endian)說法正確的是( B )A. 高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處 B. 低字節(jié)位數(shù)據(jù)存放在內(nèi)存低地址處, 高字節(jié)位數(shù)據(jù)存放在內(nèi)存高地址處C. 和編譯器相關(guān) D. 上述答案都不正確2. C語言中,系統(tǒng)自動打開的文件是( D )A.二進制文件B.隨機文件C.非緩沖文件D.設(shè)備文件3. TCP使用( B )進行流量控制。A. 3次握手法B. 窗口控制機制C. 自動重發(fā)機制D. 端口機制4. TCP/IP層IP協(xié)議的服務(wù)是( C )A. 可靠服務(wù)B. 有確認的服務(wù) C. 無連接數(shù)據(jù)報D. 以上都

2、不對5. 對于一個沒有設(shè)置任何套接口選項的阻塞套接口,調(diào)用recv接收對方的數(shù)據(jù),對方發(fā)送數(shù)據(jù)前突然斷電,下列哪種情況將會發(fā)生( A )A. recv永遠不會返回B. recv立刻返回-1C. recv立刻返回0D. recv在等待很長一段時間后返回-16. 下列哪些關(guān)于套接口選項函數(shù)的說法是正確的( C )A. SO_DONTLINGER選項是讓TCP套接口不對數(shù)據(jù)進行緩存,調(diào)用send函數(shù)后立刻將數(shù)據(jù)發(fā)送出去;B.調(diào)用SO_RCVBUF和SO_SNDBUF調(diào)整TCP窗口的大??;C. SO_REUSEADDR選項允許套接口綁定在一個已經(jīng)在使用的地址上;D. SO_MAX_MSG_SIZE選項

3、獲取每次調(diào)用TCP套接口send時,所能發(fā)送的最大字節(jié)數(shù);二、 問答題1. fork和vfork的區(qū)別?vfork用于創(chuàng)建一個新進程,而該進程的目的是exec一個新程序。vfork與fork一樣都創(chuàng)建一個子進程,但他并不把父進程地址空間完全復(fù)制到子進程中,因為子進程通常都會調(diào)用exec或(_exit),于是也就不會訪問該地址空間。vfork與fork的另一個區(qū)別是vfork保證子進程先運行,在它調(diào)用exec或_exit之后父進程才可能被調(diào)度運行。vfork使用如下例:#include #include #include #include int globvar=6;/*external var

4、iable in initialized data */intmain(void)int var; /* automatic variable on the stack */pid_t pid;var = 88;printf(before vforkn); /* we dont flush stdio */if (pid = vfork() 0),其中的a應(yīng)該定義為有符號類型還是無符號類型?無符號類型39. 怎么讓父進程知道子進程結(jié)束了?waitwaitpid40. 說說使用管道和共享內(nèi)存的整個過程?管道:a) 創(chuàng)建管道b) 讀寫共享內(nèi)存:a) 獲取keyb) 獲取共享內(nèi)存c) 映射到虛擬地址

5、空間d) 讀寫訪問e) 解映射f) 刪除共享內(nèi)存41. 進程關(guān)閉了,管道或者共享內(nèi)存還存在嗎,為什么?管道 不存在共享內(nèi)存 存在42. 僵尸進程是什么?怎么形成的,哪些情況下會形成僵尸進程?參考博客:基本概念孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養(yǎng),并由init進程對它們完成狀態(tài)收集工作。僵尸進程:一個進程使用fork創(chuàng)建子進程,如果子進程退出,而父進程并沒有調(diào)用wait或waitpid獲取子進程的狀態(tài)信息,那么子進程的進程描述符仍然保存在系統(tǒng)中。這種進程稱之為僵死進程。問題及危害unix提供了一種機制

6、可以保證只要父進程想知道子進程結(jié)束時的狀態(tài)信息, 就可以得到。這種機制就是: 在每個進程退出的時候,內(nèi)核釋放該進程所有的資源,包括打開的文件,占用的內(nèi)存等。 但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態(tài)the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放。 但這樣就導(dǎo)致了問題,如果進程不調(diào)用wait / waitpid的話, 那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統(tǒng)

7、所能使用的進程號是有限的,如果大量的產(chǎn)生僵死進程,將因為沒有可用的進程號而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進程. 此即為僵尸進程的危害,應(yīng)當(dāng)避免。孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了init進程身上,init 進程就好像是一個民政局,專門負責(zé)處理孤兒進程的善后工作。每當(dāng)出現(xiàn)一個孤兒進程的時候,內(nèi)核就把孤 兒進程的父進程設(shè)置為init,而init進程會循環(huán)地wait()它的已經(jīng)退出的子進程。這樣,當(dāng)一個孤兒進程凄涼地結(jié)束了其生命周期的時候,init 進程就會代表黨和政府出面處理它的一切善后工作。因此孤兒進程并不會有什么危害。任何一個子進程(init除外)在exit()之后,并非馬上就消失掉,

8、而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu),等待父進程處理。這 是每個 子進程在結(jié)束時都要經(jīng)過的階段。如果子進程在exit()之后,父進程沒有來得及處理,這時用ps命令就能看到子進程的狀態(tài)是“Z”。如果父進程能及時 處理,可能用ps命令就來不及看到子進程的僵尸狀態(tài),但這并不等于子進程不經(jīng)過僵尸狀態(tài)。 如果父進程在子進程結(jié)束之前退出,則子進程將由init接管。init將會以父進程的身份對僵尸狀態(tài)的子進程進行處理。僵尸進程危害場景:例如有個進程,它定期的產(chǎn) 生一個子進程,這個子進程需要做的事情很少,做完它該做的事情之后就退出了,因此這個子進程的生命周期很短,但是,父進程只管生成新的子進程,

9、至于子進程 退出之后的事情,則一概不聞不問,這樣,系統(tǒng)運行上一段時間之后,系統(tǒng)中就會存在很多的僵死進程,倘若用ps命令查看的話,就會看到很多狀態(tài)為Z的進程。 嚴(yán)格地來說,僵死進程并不是問題的根源,罪魁禍?zhǔn)资钱a(chǎn)生出大量僵死進程的那個父進程。因此,當(dāng)我們尋求如何消滅系統(tǒng)中大量的僵死進程時,答案就是把產(chǎn)生大 量僵死進程的那個元兇槍斃掉(也就是通過kill發(fā)送SIGTERM或者SIGKILL信號啦)。槍斃了元兇進程之后,它產(chǎn)生的僵死進程就變成了孤兒進 程,這些孤兒進程會被init進程接管,init進程會wait()這些孤兒進程,釋放它們占用的系統(tǒng)進程表中的資源,這樣,這些已經(jīng)僵死的孤兒進程 就能瞑目而

10、去了。代碼孤兒進程和僵尸進程測試#include #include #include #include int main() pid_t pid; /創(chuàng)建一個進程 pid = fork(); /創(chuàng)建失敗 if (pid 0) perror(fork error:); exit(1); /子進程 if (pid = 0) printf(I am the child process.n); /輸出進程ID和父進程ID printf(pid: %dtppid:%dn,getpid(),getppid(); printf(I will sleep five seconds.n); /睡眠5s,保證父進

11、程先退出 sleep(5); printf(pid: %dtppid:%dn,getpid(),getppid(); printf(child process is exited.n); /父進程 else printf(I am father process.n); /父進程睡眠1s,保證子進程輸出進程id sleep(1); printf(father process is exited.n); return 0;僵尸進程測試#include #include #include #include int main() pid_t pid; pid = fork(); if (pid 0)

12、perror(fork error:); exit(1); else if (pid = 0) printf(I am child process.I am exiting.n); exit(0); printf(I am father process.I will sleep two secondsn); /等待子進程先退出 sleep(2); /輸出進程信息 system(ps -o pid,ppid,state,tty,command); printf(father process is exiting.n); return 0;多個僵尸進程#include #include #incl

13、ude #include int main() pid_t pid; /循環(huán)創(chuàng)建子進程 while(1) pid = fork(); if (pid 0) perror(fork error:); exit(1); else if (pid = 0) printf(I am a child process.nI am exiting.n); /子進程退出,成為僵尸進程 exit(0); else /父進程休眠20s繼續(xù)創(chuàng)建子進程 sleep(20); continue; return 0;43. 僵尸進程解決辦法?(1)通過信號機制子進程退出時向父進程發(fā)送SIGCHILD信號,父進程處理SIG

14、CHILD信號。在信號處理函數(shù)中調(diào)用wait進行處理僵尸進程。測試程序如下所示:#include #include #include #include #include static void sig_child(int signo);int main() pid_t pid; /創(chuàng)建捕捉子進程退出信號 signal(SIGCHLD,sig_child); pid = fork(); if (pid 0) printf(child %d terminated.n, pid);(2)fork兩次Unix 環(huán)境高級編程8.6節(jié)說的非常詳細。原理是將子進程成為孤兒進程,從而使的父進程變?yōu)閕nit進程,通過init進程可以處理僵尸進程。測試程序如下所示:#include #include #include #include int main() pi

溫馨提示

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

最新文檔

評論

0/150

提交評論