本文主要是介绍APUE读书笔记-第二章 unix标准及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《程序员的自我修养》这本书的读书笔记就先告一段落了,最后一章的运行时库实现也没有实现,有机会再补上吧。今天又回到APUE,第一章也不给大家分享什么了,这本书的读书笔记从第二章开始。好了开始今天的主题,第二章2.4小节之前关于unix标准与实现的讨论在此也就不详细分析了,从2.5小节开始。
2.5小节主要讨论unix系统中的“限制”,主要包括两类限制:
- 编译时限制,例如,短整型的最大值是多少。编译时限制可在头文件中定义,程序在编译时可包含这些头文件。
- 运行时限制,例如,文件名有多少个字符。运行时限制要求进程调用一个函数获得限制值。
但以上这些限制都不是绝对,某些限制在一个给定的实现中可能是固定的(可采用静态地在一个头文件中定义),而在另一个实现中可能是变动的(需要有一个运行时函数调用)。为了解决这类问题(我认为主要就是提高程序的可移植性),操作系统提供了以下三种限制:
- 编译时限制(头文件)。
- 与文件或目录无关的运行时限制(sysconf函数)。
- 与文件或目录有关的运行时限制(pathconf和fpathconf函数)。
2.5.1节主要分析ISO C的限制,ISO C定义的所有编译时限制都列在<limits.h>(在/usr/include/文件夹下)。有关于浮点类型数据的限制都定义在<floats.h>中。还有一部分常量定义在<stdio.h>中。
2.5.2节主要分析POSIX的限制,共包括7类限制与常量,在此就不给大家展开讨论了,以后用到了再说。这里要谈一点的就是,POSIX标准中定义的最小可接受值过小,一般实现中的最小值都要大于这一数值,因此在编译时不能使用POSIX标准中定义的常量,而应使用系统中具体的实现值。其中某些值由POSIX.1定义为“可能不确定的”(逻辑上是无限的),这意味着该值没有实际上限。
2.5.4节给出了三个函数,这三个函数可用于确定一个特定系统实际支持的限制值(不确定的值也可以通过上述函数获得,但不确定的值通过返回-1来体现)。三个函数的原型定义如下:
#include<unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathname(int fd, int name);
后两个函数的区别在于:第二个是使用路径名作为其参数,而第三个是使用文件描述符作为参数。
sysconf函数所使用的name参数,用于标识系统限制。以_SC_开头的常量用于标识运行时限制的sysconf参数。在我的机器上<unistd.h>中包含有“#include <bits/confname.h>”,这个文件位于/usr/include/x86_64-linux-gnu/bits/文件夹下,在该文件中就定义有相关的常量,这些常量被组织称为enum变量,所以此处也可以看到sysconf的值实际上就是一个从0开始的int值。pathconf与fpathname的name参数情况类似。
这里要着重谈一下这三个函数的返回值:
- 如果name参数不正确,那么这三个函数都返回-1,并将errno设为EINVAL。如果某个name返回的值不确定,那么同样返回-1,但此时不改变errno的值,所以对于这三个函数的利用,首先需要设置errno为0,在返回-1的情况下,同时需要检查errno的值,若此时errno仍然为0,那么说明这个值在操作系统中没有定义。
- 若返回值>=0,那么说明程序正常返回。
以下内容直接引用自APUE:
对于pathconf的参数pathname以及fpathconf的参数filedes有一些限制。如果不满足其中任何一个限制,则结果是未定义的:
- _PC_MAX_CANON和_PC_MAX_INPUT所音乐呢的文件必须是终端文件;
- _PC_LINK_MAX所引用的文件可以使文件或目录。如果是目录,则返回值用于目录本身(而不是用于目录内的文件名项);
- _PC_FILESIZEBITS和_PC_NAME_MAX所引用的文件必须是目录,返回值用于该目录中的文件名;
- _PC_PATH_MAX引用的文件必须是目录。当所指定的目录是工作目录时,返回值是相对路径名的最大长度;
- _PC_PIPE_BUF所引用的文件必须是管道、FIFO或目录。在管道或者FIFO情况下,返回值是对所引用的管道或FIFO的限制值。对于目录,返回值是对在该目录中创建的任一FIFO的限制值;
- _PC_SYMLINK_MAX所引用的文件必须是目录。返回值是该目录中符号链接可能包含的字符串的最大长度。
除了以上限制外,unix还定义有一些选项,这些所谓的选项的作用就是用于判断当前使用的系统是否具备某些限制,例如_PC_CHOWN_RESTRICTED选项用于判断“使用chown是否是受限的”,选项的结果就是0或1。对于这些选项所采用的处理方法与限制相同,都是通过编译时定义(<unistd.h>),或者使用sysconf、pathconf、fpathname函数。对于这些选项存在3种可能的平台支持状态:
- 如果符号常量没有定义或定义值为-1,那么该平台在编译是不支持相应选项(听起来像废话)。
- 如果符号常量的定义值大于0,那么该平台支持相应选项。
- 如果符号常量的定义值为0,则必须调用sysconf、pathconf、fpathname函数来判断相应选项是否受到支持。
若系统定义某个符号常量的值为-1或0,同时上述三个函数的返回值为-1,那么表示相应的选项未被支持。
这篇关于APUE读书笔记-第二章 unix标准及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!