Linux開發環境及其應用 《第13周單元測驗》及其解析

1、在xsh2.c樣例程序中,主循環結束前執行了close(fd[0])。如果省略了此操作,下面哪個說法正確?

A、管道讀寫端子進程都能正常運行結束並且完成預定的功能,但父進程文件描述符資源不能正常回收,多輪循環以後資源耗盡程序將無法完成預期功能
B、會導致管道讀端子進程無法正常運行結束因而無法完成預定的功能
C、管道讀寫分別由兩個子進程完成,父進程不關心管道操作,子進程完成操作後自然會關閉文件,因此這個操作完全可以省略
D、會導致管道寫端子進程無法正常運行結束因而無法完成預定的功能

2、在xsh2.c樣例程序中,主循環結束前執行了close(fd[1])。如果省略了此操作,下面哪個說法正確?

A、管道讀寫分別由兩個子進程完成,父進程不關心管道操作,子進程完成操作後自然會關閉文件,因此這個操作完全可以省略
B、會導致管道讀端子進程無法正常運行結束因而無法完成預期功能
C、會導致管道寫端子進程無法正常運行結束因而無法完成預期功能
D、管道讀寫端子進程都能正常運行結束並且完成預定的功能,但父進程文件描述符資源不能正常回收,多輪循環以後資源耗盡程序無法完成預期功能

在這裏插入圖片描述

題目1和題目2是相似的問題,在xsh2.c中,主進程開了兩個子進程,兩個子進程之間實現通信,主進程的作用僅僅是創建兩個子進程,它沒有參與任何具體任務。
fd[0]、fd[1]分別是讀和寫
只有寫端都關閉了,讀才能返回。《解題核心》
第2題中,一個讀進程,一個寫進程,寫進程寫完之後,進程釋放,但是由於主進程仍連着寫端,導致讀進程的讀無法正常返回,讀進程一直不釋放,主進程的wait()就一直阻塞,導致了死鎖,程序無法完成正常功能。
第1題,不關閉主進程的寫,讀寫進程都可以正常釋放,功能正常,for循環正常進行,不好的地方就是主進程每一次for都沒有關閉讀,文件描述符無法正常回收。

3、下面哪些C語言調用或者操作可能會導致進程收到信號?

A、pause
B、給數組元素a[i]賦值
C、條件運算
D、邏輯運算

數組越界,寫了不可寫的區域

4、兩個進程,只有由共同祖先創建的匿名管道纔可能用來實現兩進程之間的通信,對於命名管道,沒有這樣的要求。

課件原話

5、多個進程利用同一個管道向某一個進程發送數據,由於管道只允許一個發送端進程和一個接收端進程,所以無法實現這樣的機制,但是可以通過多個管道實現,每個管道承載一個產生數據的進程的數據。

×

管道只允許一個發送端進程和一個接收端進程 這句話是錯誤的,可以實現一個寫端,多個讀端

6、Linux設計的非常健壯,儘管如此,多個進程利用管道通信也可能因操作不當產生死鎖。

×

錯略與機制分離的機制

7、在一個普通函數中,goto語句可以實現函數內部語句之間的跳轉。全局跳轉可以實現跨函數之間的跳轉,但是隻能跳轉到本函數或本函數調用嵌套之外層函數的某一執行過的位置恢復運行。之前程序運行從這一位置到全局跳轉前的這段時間裏新誕生的局部變量都被銷燬,但對全局變量的修改無法恢復。

這句話太長了,讀一遍記憶一下得了。

8、進程設置捕獲某信號後執行函數a,當進程處於阻塞狀態時收到這個信號,進程將轉去執行函數a,函數a執行完畢,進程將重返之前的阻塞狀態,等待條件滿足後退出阻塞狀態。

×

進程不再回到阻塞狀態,被喚醒之後,阻塞就被打斷了,返回之後從阻塞之後開始執行。

9、進程設置捕獲某信號後執行函數a,當進程正在執行用戶態代碼時收到這個信號,進程將轉去執行函數a,函數a完成任務後,執行return語句返回,進程將重返之前中斷處代碼繼續運行。

有的同學考慮函數a中有siglongjmp或exit之類的調用,的確就回不到之前中斷處代碼繼續運行。這個考慮是對的,爲了讓題幹更嚴謹些,特意強調了return語句返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章