ch02 UNIX标准化及实现

来源:互联网 发布:opencv python 投影法 编辑:程序博客网 时间:2024/06/05 06:32
*sysconf、pathconf 和fpathconf 函数
 #include <unistd.h>
 long sysconf(int name);
 long pathconf(const char pathname, int name);
 long fpathconf(int fields, int name);
 表2-5中列出了这三个函数所使用的name参数。以_SC_开始的常数用作为sysconf的参数,而以_PC_开始的常数则作为pathconf或fpathconf的参数。

        表2-5 对sysconf、pathconf和fpathconf的限制及 name参数
---------------------------------------------------------------------------------------------
  限 制 名                说明                   name 参数
---------------------------------------------------------------------------------------------
ARG_MAX                exec函数的参数最大长度(字节)         _SC_ARG_MAX
CHILD_MAX                          每个实际用户 ID的最大进程数         _SC_CHILD_MAX
clock ticks/second              每秒时钟滴答数                 _SC_CLK_TCK
NGROUP_MAX                      每个进程的最大同时添加组ID数         _SC_NGROUPS_MAX
OPEN_MAX                        每个进程最大打开文件数             _SC_OPEN_MAX
PASS_MAX                        口令中的最大有效字符数             _SC_PASS_MAX
STREAM_MAX            在任一时刻每个进程的最大标准 I/O 流数——如     _SC_STREAM_MAX
                                若定义,则其值一定与FOPEN_MAX相同
TZNAME_MAX                      时区名中的最大字节数             _SC_TZNAME_MAX
---------------------------------------------------------------------------------------------
_POSIX_JOB_CONTROL        指明实现是否支持作业控制             _SC_JOB_CONTROL
_POSIX_SAVED_IDS        指明实现是否支持保存的设置 -用户-ID和保存的    _SC_SAVED_IDS
                设置-组-ID
_POSIX_VERSION             指明POSIX.1版本                _SC_VERSION
_XOPEN_VERSION          指明XPG版本(非 POSIX.1)            _SC_XOPEN_VERSION
---------------------------------------------------------------------------------------------                                 
LINK_MAX             文件连接数的最大值             _PC_LINK_MAX
MAX_CANON             在一终端规范输入队列的最大字节数         _PC_MAX_CANON
MAX_INPUT             终端输入队列可用空间的字节数         _PC_MAX_INPUT
NAME_MAX             文件名中的最大字节数(不包括 null结束符)     _PC_NAME_MAX
PATH_MAX             相对路径名中的最大字节数(不包括 null结束符)    _PC_PATH_MAX
PIPE_BUF             能原子地写到一管道的最大字节数         _PC_PIPE_BUF
_POSIX_CHOWN_RESTRICTED     指明使用chown是否受到限制             _PC_CHOWN_RESTRICTED
_POSIX_NO_TRUNC         指明若路径名长于 NAME_MAX是否产生一错误     _PC_NO_TRUNC
_POSIX_VDISABLE         若定义,终端专用字符可用此值禁止         _PC_VDISABLE

---------------------------------------------------------------------------------------------

*具体输出:

ARG_MAX                = 2097152
CHILD_MAX            = (not defined)
clock ticks/second    = 100
NGROUPS_MAX            = 65536
OPEN_MAX            = 1024
STREAM_MAX            = 16
TZNAME_MAX            = 6
_POSIX_JOB_CONTROL    = 1
_POSIX_SAVED_IDS    = 1
_POSIX_VERSION        = 200809
MAX_CANON            = 255
MAX_INPUT            = 255
_POSIX_VDISABLE        = 0
LINK_MAX            = 32000
NAME_MAX            = 255
PATH_MAX            = 4096
PIPE_BUF            = 4096
_POSIX_NO_TRUNC    = 1
_POSIX_CHOWN_RESTRICTED = 1

*为路径名动态地分配空间
#include <errno.h>
#include <limits.h>
#include "ourhdr.h"

#ifdef PATH_MAX
static int pathmax = PATH_MAX;
#else
static int pathmax =0;
#endif

char * path_alloc (int *size)
{
    char *ptr;
    if(pathmax == 0)
    {   
        errno = 0;
        if((pathmax = pathconf("/", _PC_PATH_MAX)) < 0)
        {   
            if(errno == 0)
                pathmax = PATH_MAX_GUESS;
            else
                err_sys("pathconf error for _PC_PATH_MAX");
        }   
        else
            pathmax++;
    }   
    if((ptr = malloc(pathmax + 1)) == NULL)
        err_sys("malloc error for pathname");
    if(size != NULL)
        *size = pathmax + 1;
    return(ptr);
}
*确定文件描述符数
#include <errno.h>
#include <limits.h>
#include "ourhdr.h"

#ifdef OPEN_MAX
static int openmax = OPEN_MAX;
#else
static int openmax = 0;
#endif

#define OPEN_MAX_GUESS 256

int open_max(void)
{
    if(openmax == 0)
    {
        errno = 0;
        if((openmax = sysconf(_SC_OPEN_MAX)) < 0)
        {
            if(errno == 0)
                openmax = OPEN_MAX_GUESS;
            else
                err_sys("sysconf error for _SC_OPEN_MAX");
        }
    }
    return(openmax);
}
*功能测试宏:__STDC__
#ifdef _STDC__
void *myfunc(const char *, int);
#else
void *myfunc();
#endif
*            基本系统数据类型
----------------------------------------------------------------------------------
    类型                                          说明
----------------------------------------------------------------------------------
caddr_t                         内存地址( 12.9节)
clock_t                          时钟滴答计数器(进程时间) (1.10节)                                   
comp_t                         压缩的时钟滴答( 8.13节)
dev_t                            设备号(主和次)(4.23节)
fd_set                           文件描述符集( 12.5.1节)
fpos_t                           文件位置( 5.10节)
gid_t                             数值组ID
ino_t                             i节点编号( 4.14节)
mode_t                         文件类型,文件创建方式( 4.5节)
n1ink_t                         目录项的连接计数( 4.10节)
off_t                              文件长度和位移量(带符号的)(lseek, 3.6节)
pid_t                             进程ID和进程组ID(带符号的)(8.2和9.4节)
ptrdiff_t                         两个指针相减的结果(带符号的)
r1im_t                           资源限制( 7.11节)
sig_atomic_t                 能原子地存取的数据类型( 10.15节)
sigset_t                         信号集(10.11节)
size_t                            对象(例如字符串)长度(不带符号的) (3.7节)                                              
ssize_t                          返回字节计数的函数(带符号的)(read, write, 3.7节)
time_t                           日历时间的秒计数器( 1.10节)
uid_t                             数值用户ID
wchar_t                        能表示所有不同的字符码

原创粉丝点击