unix高階環境程式設計.第一章習題答案
習題
1.1,在系統上查證,除根目錄外,目錄.和..是不同的。
- 普通目錄對比
- 根目錄對比
1.2, 分析程式1-4的輸出,說明程序ID為852和853的程序發生了什麼情況?
程式碼
-
/*1-4
-
* print the process id
-
*/
-
#include "apue.h"
-
int main()
-
{
-
printf("this Process id:%d",getpid());
-
return 0;
-
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 輸出結果
分析:
Linux中,新建立一個程序時,核心會按順序將下一個可用的程序分配給其使用。每當程序號到達32767的限制時,核心將重置程序號計數器,以便從小整數重新開始分配。
分配方式具體如下:
一旦程序號大到達32767,核心會將程序重置為300,而不是1,是因為低數值的程序號為系統程序和守護程序長期佔用。
注: 在Linux 2.4版本及更早版本中,程序號的上限是32767,由核心常量PID_MAX所定義。在Linux 2.6版本中,情況有所改變。儘管程序號的預設上限仍是32767,但是可以通過Linux系統特有的/proc/sys/kernel/pid_max檔案來進行調整(其值=最大程序+1)。在32位平臺中,pid_max檔案的最大值為32767,但是在64位平臺中,該檔案的最大值可以高達2^22次方(約400萬),系統可容納的程序數量會非常龐大。
1.3,在1.7節中,perror的引數是用ISO C的屬性const定義的,而strerror的整型引數則沒有用此屬性。為什麼?
- strerror函式:char * (int errnum);
功能:將errnum(它通常是errno值)對映為一個出錯資訊字串,並且返回此字串的指標
- perror函式:void perror(const char * msg);
功能:它首先輸出msg指向的字串,然後是一個冒號,一個空格,接著是對應errno值的出錯資訊。最後是一個換行符。
因為msg被定義為const所以在程式執行過程中,它將一直保持呼叫此函式時傳入的值。如果試著修改msg的話,將導致程式無法遍歷。即保證msg在輸出過程中不被修改。
1.4,在附錄B中包含了記錄出錯函式log_doit,當呼叫函式時,先儲存了errno的值,為什麼?
因為errno是全域性變數,如果不先儲存,可能在執行過程中,errno被修改後,那麼log_doit記錄的值就不是原來發生錯誤的值。
1.5,若日曆時間存放在帶符號的32整數中,那麼到那一年它將溢位?用什麼方法擴充套件浮點數?它們是否與與存在的應用相容?
日曆時間是從1970年1月1日 00:00:00開始每個一秒增加1。32位帶符號整型最大值為2^31 -1 = 2147483647。然後計算得到最大日期為2038-01-19 11:14:07。即2038年。
擴充套件浮點數,採用IEEE754編碼方式。
1.6 若程序時間存放在帶符號的32位整型數中,而且每秒為100滴答,那麼經過多少天時間將會溢位。
32位帶符號整型最大值為2^31 -1 = 2147483647。一秒增加100。那麼2147483647/100/60/60/24 = 248.55天,就會溢位。