1. 程式人生 > >unix高階環境程式設計.第一章習題答案

unix高階環境程式設計.第一章習題答案

習題

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

  • 普通目錄對比

普通目錄對比

  • 根目錄對比 
    根目錄的對比

1.2, 分析程式1-4的輸出,說明程序ID為852和853的程序發生了什麼情況?

程式碼

 
  1. /*1-4

  2. * print the process id

  3. */

  4. #include "apue.h"

  5.  
  6. int main()

  7. {

  8. printf("this Process id:%d",getpid());

  9. return 0;

  10. }

  • 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天,就會溢位。