關於apue第二章獲取絕對路徑長度程式path_alloc()分析

2puT發表於2016-07-08
#include "apue.h"
#include
#include

#ifdef PATH_MAX
static int pathmax = PATH_MAX;   //假如limits.h中定義了PATH_MAX,就直接取limits.h定義的值
#else
static int pathmax = 0;  //如果limits.h並未定義PATH_MAX,暫且給定0,在後面會計算出這個變數的值
#endif

#define      SUSV3   200112L

static long posix_version = 0;

/* If PATH_MAX is indeterminate, no guarantee this is adequate */
#define PATH_MAX_GUESS 1024

char *
path_alloc(int *sizep) /* also return allocated size, if nonnull */
{
char *ptr;
int size;

if (posix_version == 0)
posix_version = sysconf(_SC_VERSION); //獲取posix標準版本號

if (pathmax == 0) {/* first time through */  //如果在limits.h中未定義PATH_MAX
errno = 0;      //將錯誤號置0
if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {           //假定當前工作目錄是 / ,獲取相對於 / 的相對地址長度,也就相當是絕對地址的長度,當返回值小於0時,可能有下面兩種情況
   if (errno == 0)
pathmax = PATH_MAX_GUESS;/* it's indeterminate */   //當錯誤號依舊為0,也就是pathconf()併為發生錯誤,這種狀態下,我們認定PATH_MAX為不確定的,我們只能猜測某個值,這裡猜測為1024
else
err_sys("pathconf error for _PC_PATH_MAX");//錯誤號不為0時,pathconf()執行出錯
} else {
pathmax++;/* add one since it's relative to root */   //當pathconf()返回>0的值時,認為PATH_MAX為執行時的限制值,故絕對地址是相對地址加上/的長度,也就是+1
}
}
if (posix_version < SUSV3)
size = pathmax + 1;  //當posix版本小於上述值時,絕對路徑末尾要加上null
else
size = pathmax;  //以後的版本不需要在路徑末尾加上null

if ((ptr = malloc(size)) == NULL)       
err_sys("malloc error for pathname");

if (sizep != NULL)
*sizep = size;
return(ptr);
}

疑問:當limits.h中定義了PATH_MAX的時候,為什麼可以直接將這個長度作為絕對路徑的長度,PATH_MAX不是指相對路徑名的最大位元組數嗎,在fedora10系統中,PATH_MAX = 4096,在apue P104頁中,為何getcwd(ptr,size)
size的值被賦予4096呢,假如/ 後面跟有4096個位元組的相對路徑地址呢,那不是有4097個位元組,那不是不夠空間去分配,linux系統中是否對絕對路徑的最大位元組數有限定呢?
       可能解答:絕對路徑的最大位元組數也不能超過PATH_MAX;  有待證實
        pathmax = pathconf("/", _PC_PATH_MAX)) < 0) 是求的相對於/的相對路徑的最大長度嗎?
 如果是的話,那樣就是不管怎麼樣,所求出來的長度正好是當前路徑的長度。/ + 相對路徑 = 絕對路徑

相關文章