首页 > 代码库 > 第四篇:“ 不确定 "限制值的使用

第四篇:“ 不确定 "限制值的使用

前言

       前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 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初始化为010 static int    pathmax = 0;11 #endif12 13 #define SUSV3    200112L14 15 static long    posix_version = 0;16 17 #define    PATH_MAX_GUESS    102418 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置031         errno = 0;32         if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {33             // 如果限制值获取函数返回-1并且errno没改,则说明该值是不确定的,我们赋给它一个缺省的值。34             if (errno == 0)35                 pathmax = PATH_MAX_GUESS;    36             else37             // 如果限制值获取函数返回-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的话则要给末尾的\n也分配空间46         size = pathmax + 1;47     else48         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 }

第四篇:“ 不确定 "限制值的使用