前言

前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 45类型 ),当限制值获取函数返回-1的时候,我们无法仅通过这个函数返回值-1来判断是限制值获取失败还是限制值是不确定的,因为这两种情况函数的返回值均为-1。这样就给编程带来了不变。

本文将教你如何获取到未确定类型的限制值的真正情况。

解决思路

可以在调用限制值获取函数之前,先将errno变量置为0。调用之后,如果函数返回-1,那么有两种情况:1. errno依然为0,这表示该限制值是不确定的。2. errno不为0,这表示限制值获取出错了;如果函数返回的数不是-1,那说明该限制值是确定的并已作为函数返回值传回了。

代码示例

下面的代码展示了一个函数,它的功能是为路径名分配存储区( 体现了未确定限制值使用的方法 ):

 #include "apue.h"
#include <errno.h>
#include <limits.h> // 如果已经定义了PATH_MAX,则pathmax就赋值为它。
#ifdef PATH_MAX
static int pathmax = PATH_MAX;
#else
// 如果没有则pathmax初始化为0
static int pathmax = ;
#endif #define SUSV3 200112L static long posix_version = ; #define PATH_MAX_GUESS 1024 char *
path_alloc(int *sizep) // sizep指向的整型变量用来存放最终分配空间的大小
{
char *ptr;
int size; if (posix_version == )
posix_version = sysconf(_SC_VERSION); // 第一次执行此函数时
if (pathmax == ) {
// 先将errno置0
errno = ;
if ((pathmax = pathconf("/", _PC_PATH_MAX)) < ) {
// 如果限制值获取函数返回-1并且errno没改,则说明该值是不确定的,我们赋给它一个缺省的值。
if (errno == )
pathmax = PATH_MAX_GUESS;
else
// 如果限制值获取函数返回-1并且errno被设置了,则说明限制值获取失败,退出函数。
err_sys("pathconf error for _PC_PATH_MAX");
} else {
// 加上根目录的长度
pathmax++;
}
}
if (posix_version < SUSV3)
// 如果不是SUSV3的话则要给末尾的\n也分配空间
size = pathmax + ;
else
size = pathmax; if ((ptr = malloc(size)) == NULL)
err_sys("malloc error for pathname"); // 将分配空间的大小赋给sizep指向的整型变量
if (sizep != NULL)
*sizep = size;
return(ptr);
}

最新文章

  1. php-resque的设计和使用
  2. Linux下常用SVN命令
  3. gdb 常用内容
  4. 用Python3实现表达式求值
  5. django--app(六)
  6. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)
  7. HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传
  8. eclipse debug时老提示edit source lookup path解决方案
  9. 字符设备驱动[深入]:linux cdev详解
  10. Linux指令--tar,gzip
  11. 高校学生征信系统Postmortem结果
  12. jQuery插件之-----弹性运动
  13. 使用 navicat 导入导出数据库
  14. JavaScript核心基础语法
  15. Day24-Ajax操作、图片验证码、KindEditor使用-转
  16. python测试开发django-23.admin列表页优化和排序
  17. 关于sqlite使用场景
  18. 第一次项目冲刺(Alpha版本)2017/11/14
  19. pytest 失败重跑截图
  20. Linux-JAVA-JDK完整配置过程

热门文章

  1. activeMq发送消息流程
  2. 01-hibernate注解:类级别注解准备工作
  3. Manual close is not allowed over a Spring managed SqlSession(转)
  4. Asp.Net MVC项目通过Git同步到新开发设备上后无法作为网站启动
  5. 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core
  6. python selenium--常用函数3
  7. unity, Awake的调用时机
  8. Javascript实现真实字符串剩余字数提示
  9. Atitit.检测文本文件的编码&#160;自动获取文件的中文编码
  10. bootstrip可视化布局