zoukankan      html  css  js  c++  java
  • 第四篇:“ 不确定 "限制值的使用

    前言

           前篇文章解释了限制值的五种类型以及获取它们的方法。但是对于其中可能不确定的类型( 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 }
  • 相关阅读:
    数据库各类模板
    React+Cesium安装部署
    VS2019+QT 制作自定义控件
    Vue+arcgis(1)
    将TIF/PNG等转为GeoTIFF
    QT 同名信号无法识别的问题
    VSCode配置PyQt5
    Python中类属性和self属性的区别
    postgresql的数据复制
    在windows server 2012 R2上搭建nginx环境
  • 原文地址:https://www.cnblogs.com/muchen/p/6354459.html
Copyright © 2011-2022 走看看