【轉】apue《UNIX環境高級編程第三版》第一章答案詳解


原文網址:http://blog.csdn.net/hubbybob1/article/details/40859835

大家好,從這周開始學習apue《UNIX環境高級編程第三版》,在此,我要感謝網易的一個工程師朋友和室友,沒有他們,我不會開始真正的學習這本書,希望大家以后開始慢慢進步。廢話少說,直接上課后習題了。

UNIX高級編程第一章習題答案:

1.1在系統上驗證,除根目錄外,目錄l和l l是不同的。

答:這個驗證有很多方法可使用命令ls 、cd、vim等,目錄.指向當前目錄,目錄..指向父目錄,在根目錄中這兩個是相同的。首先是根目錄

 

可見在根目錄下,目錄.和目錄..都是指向本目錄的。

 

結果顯然易見。有興趣可以使用vim .與vim..

1.2分析圖1-6程序的輸出,說明進程ID為852和853的進程發生了什么情況?

答:UNIX是多任務系統,在程序運行的同時其他兩個進程也在運行,編程運行如下圖所示

 

由上圖可見進程PID是一直增大的,小水試圖使用lsof  -p 15122去查詢中間的那個進程,可是一無所獲,因此可以判定這個進程在小水試圖去抓它的時候已經結束了。為什么進程的PID一直在增大,會增大到什么程度?

1.3在1.7節中,perror的參數是用ISO C的屬性const定義的,而strerror的整形參數沒有用此屬性定義,為什么?

答:因為perror的msg參數是個指針,perror就可以改變msg指向的字符串。然而使用限定符const限制了perror不能修改msg指針指向的字符串。而對於strerror,其錯誤號參數是整數類型,並且C是按值傳遞所有參數,因此即使strerror函數想修改參數的值也修改不了,也就沒有必要使用const屬性。

以我的理解是這樣的:可以從兩個函數的定義去理解

char  *strerror(int errnum);

void   perror(const char *msg);

strerror函數將errnum (通常就是errno值)映射為一個出錯消息字符串,並返回此字符串的指針,而errno的值通常是不定的(可參考errno的規則),存在多種不同的errno,當然不能使用cons修飾符了。

     而perror的作用基於error當前值,在標准錯誤上產生一條錯誤信息,首先msg它是指向error的,不能指向其他地方,不管當前error是何值,其內容是固定的,因此需要使用const。它首先輸出msg所指向的字符串,然后是一個冒號,一個空格,接着是對應的errno值,最后換行符。

1.4若日歷存放在帶符號的32位整形數中,那么哪一年它將溢出?可用什么方法擴展溢出的浮點數,采用的策略是否與現有的應用相兼容?

答:首先確定起始時間為 T=1970年1月1日 00:00:00,然后是帶符號的32位所存儲的時間t=231/(60*60*24*365)=68.0962598年,所以溢出時間為T+t=1970+68=2038年。其溢出解決辦法是將time_t數據類型定義為64位整形。

1.5若進程時間存放在帶符號的32位整形中,而且每秒100滴答,經過多少天后該數溢出?

答:t=231/(60*60*24*100)=248.551348天。

最后送上格言:學習不能固步自封。。。(如有錯誤的地方請指正)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM