前言
前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 45类型 ),当限制值获取函数返回-1的时候,我们无法仅通过这个函数返回值-1来判断是限制值获取失败还是限制值是不确定的,因为这两种情况函数的返回值均为-1。这样就给编程带来了不变。本文将教你如何获取到未确定类型的限制值的真正情况。
解决思路
可以在调用限制值获取函数之前,先将errno变量置为0。调用之后,如果函数返回-1,那么有两种情况:1. errno依然为0,这表示该限制值是不确定的。2. errno不为0,这表示限制值获取出错了;如果函数返回的数不是-1,那说明该限制值是确定的并已作为函数返回值传回了。
代码示例
下面的代码展示了一个函数,它的功能是为路径名分配存储区( 体现了未确定限制值使用的方法 ):
1 #include "apue.h" 2 #include <errno.h> 3 #include <limits.h> 4 5 // 如果已经定义了PATH_MAX,则pathmax就赋值为它。 6 #ifdef PATH_MAX 7 static int pathmax = PATH_MAX; 8 #else 9 // 如果没有则pathmax初始化为0 10 static int pathmax = 0; 11 #endif 12 13 #define SUSV3 200112L 14 15 static long posix_version = 0; 16 17 #define PATH_MAX_GUESS 1024 18 19 char * 20 path_alloc(int *sizep) // sizep指向的整型变量用来存放最终分配空间的大小 21 { 22 char *ptr; 23 int size; 24 25 if (posix_version == 0) 26 posix_version = sysconf(_SC_VERSION); 27 28 // 第一次执行此函数时 29 if (pathmax == 0) { 30 // 先将errno置0 31 errno = 0; 32 if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) { 33 // 如果限制值获取函数返回-1并且errno没改,则说明该值是不确定的,我们赋给它一个缺省的值。 34 if (errno == 0) 35 pathmax = PATH_MAX_GUESS; 36 else 37 // 如果限制值获取函数返回-1并且errno被设置了,则说明限制值获取失败,退出函数。 38 err_sys("pathconf error for _PC_PATH_MAX"); 39 } else { 40 // 加上根目录的长度 41 pathmax++; 42 } 43 } 44 if (posix_version < SUSV3) 45 // 如果不是SUSV3的话则要给末尾的 也分配空间 46 size = pathmax + 1; 47 else 48 size = pathmax; 49 50 if ((ptr = malloc(size)) == NULL) 51 err_sys("malloc error for pathname"); 52 53 // 将分配空间的大小赋给sizep指向的整型变量 54 if (sizep != NULL) 55 *sizep = size; 56 return(ptr); 57 }