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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S