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 }
  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/muchen/p/6354459.html
Copyright © 2011-2022 走看看