“ 不确定 "限制值的使用

前言

  前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 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的话则要给末尾的\n也分配空间
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 }

 

 

posted on 2014-04-02 22:52  空山悟  阅读(305)  评论(0编辑  收藏  举报

导航