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