apue读书笔记【四】:系统的限制
来源:互联网 发布:中年危机 知乎 编辑:程序博客网 时间:2024/05/03 22:32
UNIX系统实现定义了很多幻数和常量,其中有很多已被硬编码进程序中,或用特定的技术确定。由于大量标准化工作的努力,已有若干种可移植的方法用以确定这些幻数和实现定义的限制。这非常有助于软件的可移值性。
以下两种类型的限制是必需的:
(1)编译时限制(例如:智整型的最大值是什么 ?)
(2)运行时限制(例如:文件名可以有多少个字符?)
编译时限制可在头文件中定义,程序在编译时可以包含这些头文件。但是,运行时限制则要求进程调用一个函数以获得些种限制值。
由于各种unix系统的限制不尽相同,我们需要获得这些限制。方式有三种:
(1)编 译时限制(头文件)
(2)不与文件或目录相关联的运行时限制(sysconf函数)
(3)与文件或目录相关联的运行时限制(pathconf和fpathconf函数)
使事情变得复杂的是,如果一个特定的运行时限制在一个给定的系统并不改变,则可将其静态地定义在一个头文件中。但是,如果没有将其定义在头文件中,则应用程序就必须调用三个conf 函数中的一个,以确定其运行时的值。
头文件:
#include<unistd.h>
函数原型:
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathname(int filedes, int name);
我们需要更详细地说明这三个函数的不同返回值。(1)如果name不是一个合适的常量,则所有这三个函数都会返回-1,并将errno设置为EINVAL。
(2)有些nam可以返回变量的值(返回值>=0),或者返回-1,这表示该值是不确定的,此时并不改变errno的值。
demo :
#include <errno.h>#include <unistd.h> /*for sysconf pathconf _SC_OPEN_MAX*/#include <stdio.h> /*for printf*/#include <stdarg.h> /*for va_list*/#include <string.h> /*for strcat strlen */#include <stdlib.h> /*for strcat exit */#defineMAXLINE4096/* max line length */static voidpr_sysconf(char *, int);static voidpr_pathconf(char *, char *, int);void err_quit(const char *fmt, ...);void err_sys(const char *fmt, ...);void err_doit(int errnoflag, int error, const char *fmt, va_list ap);int main(int argc, char *argv[]){if (argc != 2)err_quit("usage: a.out <dirname>");pr_sysconf("ARG_MAX =", _SC_ARG_MAX);pr_sysconf("CHILD_MAX =", _SC_CHILD_MAX);pr_sysconf("clock ticks/second =", _SC_CLK_TCK);pr_sysconf("NGROUPS_MAX =", _SC_NGROUPS_MAX);pr_sysconf("OPEN_MAX =", _SC_OPEN_MAX);#ifdef_SC_STREAM_MAXpr_sysconf("STREAM_MAX =", _SC_STREAM_MAX);#endif#ifdef_SC_TZNAME_MAXpr_sysconf("TZNAME_MAX =", _SC_TZNAME_MAX);#endifpr_sysconf("_POSIX_JOB_CONTROL =", _SC_JOB_CONTROL);pr_sysconf("_POSIX_SAVED_IDS =", _SC_SAVED_IDS);pr_sysconf("_POSIX_VERSION =", _SC_VERSION);pr_pathconf("MAX_CANON =", "/dev/tty", _PC_MAX_CANON);pr_pathconf("MAX_INPUT =", "/dev/tty", _PC_MAX_INPUT);pr_pathconf("_POSIX_VDISABLE =", "/dev/tty", _PC_VDISABLE);pr_pathconf("LINK_MAX =", argv[1], _PC_LINK_MAX);pr_pathconf("NAME_MAX =", argv[1], _PC_NAME_MAX);pr_pathconf("PATH_MAX =", argv[1], _PC_PATH_MAX);pr_pathconf("PIPE_BUF =", argv[1], _PC_PIPE_BUF);pr_pathconf("_POSIX_NO_TRUNC =", argv[1], _PC_NO_TRUNC);pr_pathconf("_POSIX_CHOWN_RESTRICTED =",argv[1], _PC_CHOWN_RESTRICTED);return 0;}static voidpr_sysconf(char *mesg, int name){longval;fputs(mesg, stdout);//输出第一个传数的字符串errno = 0;if ( (val = sysconf(name)) < 0) {//name不是一个合适的常量,name不存在if (errno != 0)err_sys("sysconf error");fputs(" (not defined)\n", stdout);} elseprintf(" %ld\n", val);}static voidpr_pathconf(char *mesg, char *path, int name){longval;fputs(mesg, stdout);errno = 0;if ( (val = pathconf(path, name)) < 0) {if (errno != 0)err_sys("pathconf error, path = %s", path);fputs(" (no limit)\n", stdout);} elseprintf(" %ld\n", val);}void err_quit(const char *fmt, ...){va_listap;va_start(ap, fmt);err_doit(0, 0, fmt, ap);va_end(ap);exit(1);}/* * Print a message and return to caller. * Caller specifies "errnoflag". */void err_doit(int errnoflag, int error, const char *fmt, va_list ap){char buf[MAXLINE];vsnprintf(buf, MAXLINE, fmt, ap);//把格式化的输出字符串生成if (errnoflag)snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",strerror(error));//把错误翻译成描述信息strcat(buf, "\n");//加一个换行符fflush(stdout);//冲洗标准输出的缓存区fputs(buf, stderr);//把错误信息输出到标准错误流fflush(NULL);//冲洗所有输出流}/* * Fatal error related to a system call. * Print a message and terminate. */void err_sys(const char *fmt, ...){va_listap;va_start(ap, fmt);err_doit(1, errno, fmt, ap);va_end(ap);exit(1);}
输出:
- apue读书笔记【四】:系统的限制
- APUE限制
- APUE读书笔记 6--------- 系统数据文件和信息
- APUE读书笔记
- APUE读书笔记
- APUE读书笔记
- APUE读书笔记
- APUE读书笔记之四——文件和目录
- 【qianlong88的APUE读书笔记】第一章:uinx基础知识
- APUE(四)
- 读书笔记-APUE第三版-(1)UNIX系统概述
- 读书笔记-APUE第三版-(6)系统数据文件和信息
- APUE读书笔记-第六章 系统数据文件和信息
- 《APUE》读书笔记—第六章数据系统文件和信息
- APUE函数笔记四: 系统数据文件和信息
- APUE读书笔记--进程基础
- APUE读书笔记-进程通信
- APUE读书笔记(2)
- 静态数据成员和静态成员函数
- linux mail利用外部邮箱地址发邮件
- UVA1347 - Tour (DAG上的DP)
- 工作总结日志<二> 有关PCI的
- 函数对象 及 简单的小例子
- apue读书笔记【四】:系统的限制
- hadoop学习【6】——CentOS下eclipse安装和hadoop插件安装配置
- 【大话设计模式】—— 工厂方法模式
- 【测试】如何处理与开发人员有争议的bug?
- Java8新特性——内建的功能性接口
- 用户行为数据库SkyDB
- 工作总结日志<三> 数控系统RTLinux内核上几个系统类型和函数在RTAI内核上的对应
- hdu2502
- 参考lofter的代码写的一个小html页面