APUE-第一章學習-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;
}

輸出結果

輸出結果

分析:
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天,就會溢出。

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