APUE读书笔记-第二章 unix标准及实现

2024-08-22 04:38

本文主要是介绍APUE读书笔记-第二章 unix标准及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《程序员的自我修养》这本书的读书笔记就先告一段落了,最后一章的运行时库实现也没有实现,有机会再补上吧。今天又回到APUE,第一章也不给大家分享什么了,这本书的读书笔记从第二章开始。好了开始今天的主题,第二章2.4小节之前关于unix标准与实现的讨论在此也就不详细分析了,从2.5小节开始。

 2.5小节主要讨论unix系统中的“限制”,主要包括两类限制:

  1. 编译时限制,例如,短整型的最大值是多少。编译时限制可在头文件中定义,程序在编译时可包含这些头文件。
  2. 运行时限制,例如,文件名有多少个字符。运行时限制要求进程调用一个函数获得限制值。

但以上这些限制都不是绝对,某些限制在一个给定的实现中可能是固定的(可采用静态地在一个头文件中定义),而在另一个实现中可能是变动的(需要有一个运行时函数调用)。为了解决这类问题(我认为主要就是提高程序的可移植性),操作系统提供了以下三种限制:

  1. 编译时限制(头文件)。
  2. 与文件或目录无关的运行时限制(sysconf函数)。
  3. 与文件或目录有关的运行时限制(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参数情况类似。

这里要着重谈一下这三个函数的返回值:

  1. 如果name参数不正确,那么这三个函数都返回-1,并将errno设为EINVAL。如果某个name返回的值不确定,那么同样返回-1,但此时不改变errno的值,所以对于这三个函数的利用,首先需要设置errno为0,在返回-1的情况下,同时需要检查errno的值,若此时errno仍然为0,那么说明这个值在操作系统中没有定义。
  2. 若返回值>=0,那么说明程序正常返回。

以下内容直接引用自APUE:

对于pathconf的参数pathname以及fpathconf的参数filedes有一些限制。如果不满足其中任何一个限制,则结果是未定义的:

  1. _PC_MAX_CANON和_PC_MAX_INPUT所音乐呢的文件必须是终端文件;
  2. _PC_LINK_MAX所引用的文件可以使文件或目录。如果是目录,则返回值用于目录本身(而不是用于目录内的文件名项);
  3. _PC_FILESIZEBITS和_PC_NAME_MAX所引用的文件必须是目录,返回值用于该目录中的文件名;
  4. _PC_PATH_MAX引用的文件必须是目录。当所指定的目录是工作目录时,返回值是相对路径名的最大长度;
  5. _PC_PIPE_BUF所引用的文件必须是管道、FIFO或目录。在管道或者FIFO情况下,返回值是对所引用的管道或FIFO的限制值。对于目录,返回值是对在该目录中创建的任一FIFO的限制值;
  6. _PC_SYMLINK_MAX所引用的文件必须是目录。返回值是该目录中符号链接可能包含的字符串的最大长度。

除了以上限制外,unix还定义有一些选项,这些所谓的选项的作用就是用于判断当前使用的系统是否具备某些限制,例如_PC_CHOWN_RESTRICTED选项用于判断“使用chown是否是受限的”,选项的结果就是0或1。对于这些选项所采用的处理方法与限制相同,都是通过编译时定义(<unistd.h>),或者使用sysconf、pathconf、fpathname函数。对于这些选项存在3种可能的平台支持状态:

  1. 如果符号常量没有定义或定义值为-1,那么该平台在编译是不支持相应选项(听起来像废话)。
  2. 如果符号常量的定义值大于0,那么该平台支持相应选项。
  3. 如果符号常量的定义值为0,则必须调用sysconf、pathconf、fpathname函数来判断相应选项是否受到支持。

若系统定义某个符号常量的值为-1或0,同时上述三个函数的返回值为-1,那么表示相应的选项未被支持。

这篇关于APUE读书笔记-第二章 unix标准及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095261

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核