关于apue第二章获取绝对路径长度程序path_alloc()分析

#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 on e 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) 是求的相对于/的相对路径的最大长度吗?
 如果是的话,那样就是不管怎么样,所求出来的长度正好是当前路径的长度。/ + 相对路径 = 绝对路径

你可能感兴趣的:(关于apue第二章获取绝对路径长度程序path_alloc()分析)