首页 > 代码库 > 第四篇:“ 不确定 "限制值的使用
第四篇:“ 不确定 "限制值的使用
前言
前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 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 }
第四篇:“ 不确定 "限制值的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。