原文網址: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天。
最后送上格言:學習不能固步自封。。。(如有錯誤的地方請指正)