实现文件:
注意:分配的空间需要自行释放。
//path_size.h
#ifndef _PATH_SIZE
#define _PATH_SIZE
char *path_alloc(size_t *sizep);
#endif
//path_size.c
#include <stdio.h>
#include <errno.h>
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#ifdef PATH_MAX
static long pathmax = PATH_MAX;
#else
static long pathmax = 0;
#endif
static long posix_version = 0;
static long xsi_version = 0;
/*if PATH_MAX is indeterminate,no guarantee this is adequate*/
#define PATH_MAX_GUESS 1024
char *path_alloc(size_t *sizep) //return allocated size,if nonnull
{
char *ptr;
size_t size;
if(posix_version == 0){
posix_version = sysconf(_SC_VERSION);
}
if(xsi_version == 0){
xsi_version = sysconf(_SC_XOPEN_VERSION);
}
if(pathmax == 0){
errno = 0;
}
if((pathmax = pathconf("/",_PC_PATH_MAX)) < 0){
if(errno == 0){
pathmax = PATH_MAX_GUESS;//it's indeterminate,return -1 and not change errno value
}else{
perror("pathconf error for _PC_PATH_MAX");//_PC_PATH_MAX is invalid,errno is set
}
}else{
pathmax++; //add one since it's relative to root
}
/*
Before POSIX.1-2001,we aren't guaranteed that PATH_MAX includes the terminating null byte.
*/
if((posix_version < 200112L) && (xsi_version < 4)){
size = pathmax+1;
}else{
size = pathmax;
}
if((ptr = malloc(size)) == NULL){
perror("malloc error for pathname");
}
if(sizep != NULL){
*sizep = size;
}
return(ptr);
}
测试程序:
//getpathsize.c
#include <stdio.h>
#include "path_size.h"
int main(){
char *ptr;
size_t pathSize;
ptr = path_alloc(&pathSize);
printf("ptr = %x\npahtSize = %zd\n",ptr,pathSize);
}
执行测试:
#gcc getpathsize.c path_size.c -o getpathsize
#./getpathsize
ptr = 19c0010
pahtSize = 4097