代码在下面,函数功能是为路径名动态分配内存,请高手帮忙解释一下
代码在下面,函数功能是为路径名动态分配内存,请高手帮忙解释一下
#include "apue.h"
#include <errno.h>
#include <limits.h>
#ifdef PATH_MAX
static int pathmax=PATH_MAX;
#else
static int pathmax=0;
#endif
#define SUSV3 200112L
static long posix_version=0;
#define PATH_MAX_GUESS 1024
char *path_alloc(int *sizep)
{
char *ptr;
int size;
if(posix_version==0)
posix_version=sysconf(_SC_VERSION);
if(pathmax==0){
errno=0;
if((pathmax=pathconf("/",_PC_PATH_MAX))<0){//这里要pathconf函数返回值小于0,才执行下面的语句啊,如果小于0,表示出错返回,那么errno的值一定改变了,就不能设置下面的pathmax了,怎么回事????????????????????
if(errno==0)
pathmax=PATH_MAX_GUESS;
else
err_sys("pathconf error for _PC_PATH_MAX");
}
else{
pathmax++;
}
}
if(posix_version<SUSV3)
size=pathmax+1;
else
size=pathmax;
if((ptr=malloc(size))==NULL)
err_sys("malloc error pathname");
if(sizep!=NULL)
*sizep=size;
return ptr;
}
[解决办法]
FPATHCONF
Section: Linux Programmer's Manual (3 )
Updated: 1993-04-04
--------------------------------------------
NAME
fpathconf, pathconf - get configuration values for files
SYNOPSIS
#include <unistd.h>
long fpathconf(int filedes, int name);
long pathconf(char *path, int name);
DESCRIPTION
fpathconf() gets a value for the configuration option name for the open file descriptor filedes.
pathconf() gets a value for configuration option name for the file name path.
The corresponding macros defined in <unistd.h> are minimum values; if an application wants to take advantage of values which may change, a call to fpathconf() or pathconf() can be made, which may yield more liberal results.
Setting name equal to one of the following constants returns the following configuration options:
_PC_LINK_MAX
returns the maximum number of links to the file. If filedes or path refer to a directory, then the value applies to the whole directory. The corresponding macro is _POSIX_LINK_MAX.
_PC_MAX_CANON
returns the maximum length of a formatted input line, where filedes or path must refer to a terminal. The corresponding macro is _POSIX_MAX_CANON.
_PC_MAX_INPUT
returns the maximum length of an input line, where filedes or path must refer to a terminal. The corresponding macro is _POSIX_MAX_INPUT.
_PC_NAME_MAX
returns the maximum length of a filename in the directory path or filedes. the process is allowed to create. The corresponding macro is _POSIX_NAME_MAX.
_PC_PATH_MAX
returns the maximum length of a relative pathname when path or filedes is the current working directory. The corresponding macro is _POSIX_PATH_MAX.
_PC_PIPE_BUF
returns the size of the pipe buffer, where filedes must refer to a pipe or FIFO and path must refer to a FIFO. The corresponding macro is _POSIX_PIPE_BUF.
_PC_CHOWN_RESTRICTED
returns nonzero if the chown(2) call may not be used on this file. If filedes or path refer to a directory, then this applies to all files in that directory. The corresponding macro is _POSIX_CHOWN_RESTRICTED.
_PC_NO_TRUNC
returns nonzero if accessing filenames longer than _POSIX_NAME_MAX generates an error. The corresponding macro is _POSIX_NO_TRUNC.
_PC_VDISABLE
returns nonzero if special character processing can be disabled, where filedes or path must refer to a terminal.
RETURN VALUE
The limit is returned, if one exists. If the system does not have a limit for the requested resource, -1 is returned, and errno is unchanged. If there is an error, -1 is returned, and errno is set to reflect the nature of the error.
CONFORMING TO
POSIX.1
NOTES
Files with name lengths longer than the value returned for name equal to _PC_NAME_MAX may exist in the given directory.
Some returned values may be huge; they are not suitable for allocating memory.
SEE ALSO
getconf(1), open(2), statfs(2), sysconf(3)