習題
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天,就會溢出。