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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义