Unix 系统限制

系统限制

 

  Unix 系统定义了很多幻数和常量,有些已被硬编码进程序中,有些要用特定的技术

1. 限制分类

       两种类型的限制是必须的:

  (1)    编译时限制(如短整形最大值多少):可以在头文件中定义,程序在编译时可以包含这些头文件。在一个给定系统中不会改变

  (2)    运行时限制(如文件名多少字符):要求进程调用一个函数来获取。在一个给定系统中可能会改变,例如:unix支持多文件系统,不同文件系统所支持的文件名长度可              能不同,属于运行是限制。

  注:某些限制在给定的实现中可能是固定的(可以静态的在一个文件中定义),在另一个实现中可能是变化的(需要一个运行时函数调用)。例如:文件名最大字符数,在不同的系统可能不一样,属于运行时限制。

       提供了一下三种限制解决问题

  (1)    编译时限制(头文件)

  (2)    不与文件或目录相关联的运行时限制(sysconfig函数)。

  (3)    与文件或目录相关联的运行时限制(pathconfig和fpathconig)。

  如果一个特定的运行时限制在一个给定的系统上不改变,可以定义在一个头文件中。但是若头文件中没有定义则需要调用conf函数中一个。

2. ISO C限制

       ISO C限制都是编译时限制

       <limits.h>定义了C标准限制,这些常量都在头文件中,在一个给定系统中不会改变。

       <float.h>定义了一组浮点类型常量

   <stdio.h>: FOPEN_MAX:具体实现保证可同时打开的标准I/O流最小数,最小值8。POSIX.1中STREAM_MAX(若定义)必须与FOPEN_MAX相同值。

                      TMP_MAX:由tmpname函数产生的唯一文件名最大值。

3. Posix 限制

       POSIX.1定义了涉及操作系统实现限制的常量

       与接口相关的部分限制与常量分5类:

       (1)<limits.h> 不变最小值,共19个常量,_POSIX_开头.

       (2)不变值:SSIZE_MAX;

       (3)运行时可以增加的值

       (4)运行时不变的值(可能不确定

       (5)路径名可变值(可能不确定

       总共44个限制和常量,一些定义在<limits.h>,其余按具体条件可定义或不定义。

  19个不变最小值是不变的,它们不随系统而改变,而且是最小值(注:这些不变最小值在一些实际应用中太小)。

      不变最小值去掉前缀_POSIX_是实现值,这些实现值不能确保都定义在<limits.h>中,某个特定值可能不再其中,理由:一个给定进程的实际值可能依赖于系统的存储总量。若没有在头文件中定义,则不能在编译时作为数组边界。可以使用sysconf.pathconf,fpathconfig在运行时获取实际值。

      可能不确定(逻辑上无上限):该值没有实现上限。

4. XSI限制

       (1)不变最小值:10个常量。

       (2)数值限制:LONG_BIT和WORD_BIT;

        (3) 运行时不变值(可能不确定):ATEXIT_MAX, IOV_MAX和PAGE_SIZE.

5. 获取运行时限制

       #include<unistd.h>

       long sysconf(int name);

       long pathconf(const char *pathname, int name)  ;路径名

       long fpathconf(int filedes, int name);                    文件描述符

                            所有函数返回值:成功返回相应值,出错-1

       _SC_开头常量:sysconf参数name。

       _PC_开头常量:pathconf或fpathconf参数name。

  注:(1)name不是合适常量,返回-1,errno=EINVAL;

        (2)有些name可以改变返回的变量值(>=0),或者返回-1:表示该值不确定。不改变errno。

       (3)_SC_CLK_TCK返回值每秒时钟滴答数,用于times函数。

原文地址:https://www.cnblogs.com/hancm/p/3668366.html