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

相关文章

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1