本节书摘来自异步社区《UNIX环境高级编程(第3版)》一书中的第2章,第2.6节,作者:【美】W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 选项

图2-5列出了POSIX.1的选项,并且2.2.3节讨论了XSI的选项组。如果我们要编写可移植的应用程序,而这些程序可能会依赖于这些可选的支持的功能,那么就需要一种可移植的方法来判断实现是否支持一个给定的选项。

如同对限制的处理(见2.5节)一样,POSIX.1定义了3种处理选项的方法。

(1)编译时选项定义在中。

(2)与文件或目录无关的运行时选项用sysconf函数来判断。

(3)与文件或目录有关的运行时选项通过调用pathconf或fpathconf函数来判断。

选项包括了图2-5中第3列的符号以及图2-19和图2-18中的符号。如果符号常量未定义,则必须使用sysconf、pathconf或fpathconf来判断是否支持该选项。在这种情况下,这些函数的name参数前缀_POSIX必须替换为_SC或_PC。对于以_XOPEN为前缀的常量,在构成name参数时必须在其前放置_SC或_PC。例如,若常量_POSIX_RAW_THREADS是未定义的,那么就可以将name参数设置为SC_RAW_THREADS,并以此调用sysconf来判断该平台是否支持POSIX线程选项。如若常量_XOPEN_UNIX是未定义的,那么就可以将name参数设置为_SC_XOPEN_UNIX,并以此调用sysconf来判断该平台是否支持XSI扩展。

对于每一个选项,有以下3种可能的平台支持状态。

(1)如果符号常量没有定义或者定义值为−1,那么该平台在编译时并不支持相应选项。但是有一种可能,即在已支持该选项的新系统上运行老的应用时,即使该选项在应用编译时未被支持,但如今新系统运行时检查会显示该选项已被支持。

(2)如果符号常量的定义值大于0,那么该平台支持相应选项。

(3)如果符号常量的定义值为0,则必须调用sysconf、pathconf或fpathconf来判断相应选项是否受到支持。

图2-18总结了pathconf和fpathconf使用的符号常量。除了图2-5中列出的选项之外,图2-19总结了其他一些sysconf使用的未弃用的选项及它们的符号常量。注意,我们省略了与实用命令相关的选项。

如同系统限制一样,关于sysconf、pathconf和fpathconf如何处理选项,有如下几点值得注意。

(1)_SC_VERSION的返回值表示标准发布的年(以4位数表示)、月(以2位数表示)。该值可能是198808L、199009L、199506L或表示该标准后续版本的其他值。与SUSv3(POSIX.1 2001年版)相关连的值是200112L,与SUSv4(POSIX.1 2008年版)相关连的值是200809L。

(2)_SC_XOPEN_VERSION的返回值表示系统支持的XSI版本。与SUSv3相关联的值是600,与SUSv4相关的值是700。

(3)_SC_JOB_CONTROL、_SC_SAVED_IDS以及_PC_VDISABLE的值不再表示可选功能。虽然XPG4和SUS早期版本要求支持这些选项,但从SUSv3起,不再需要这些功能,但这些符号仍然被保留,以便向后兼容。

(4)符合POSIX.1-2008的平台还要求支持下列选项:

  • _POSIX_ASYNCHRONOUS_IO
  • _POSIX_BARRIERS
  • _POSIX_CLOCK_SELECTION
  • _POSIX_MAPPED_FILES
  • _POSIX_MEMORY_PROTECTION
  • _POSIX_READER_WRITER_LOCKS
  • _POSIX_REALTIME_SIGNALS
  • _POSIX_SEMAPHORES
  • _POSIX_SPIN_LOCKS
  • _POSIX_THREAD_SAFE_FUNCTIONS
  • _POSIX_THREADS
  • _POSIX_TIMEOUTS
  • _POSIX_TIMERS

这些常量定义成具有值200809L。相应的_SC符号同样是为了向后兼容而被保留下来的。

(5)如果对指定的pathname或fd已不再支持此功能,那么_PC_CHOWN_RESTRICTED和_PC_NO_ TRUNC返回−1,而errno不变,在所有符合POSIX的系统中,返回值将大于0(表示该选项被支持);

(6)_PC_CHOWN_RESTRICT引用的文件必须是一个文件或者是一个目录。如果是一个目录,那么返回值指明该选项是否可应用于该目录中的各个文件。

(7)_PC_NO_TRUNC和_PC_2_SYMLINKS引用的文件必须是一个目录。

(8)_PC_NO_TRUNC的返回值可用于目录中的各个文件名。

(9)_PC_VDISABLE引用的文件必须是一个终端文件。

(10)_PC_ASYNC_IO、_PC_PRIO_IO和_PC_SYNC_IO引用的文件一定不能是一个目录。

图2-20列出了若干配置选项以及在本书所讨论的4个示例系统上的对应值。如果系统定义了某个符号常量但它的值为−1或0,但是相应的sysconf或pathconf调用返回的是−1,就表示该项未被支持。可以看到,有些系统实现还没有跟上Single UNIX Specification的最新版本。

注意,当用于Solaris PCFS文件系统中的文件时,对于_PC_NO_TRUNC,pathconf返回−1。PCFS文件系统支持DOS格式(软盘格式),DOS文件名按DOS文件系统所要求8.3格式截断,在进行此种操作时并无任何提示。

《UNIX环境高级编程(第3版)》——2.6 选项相关推荐

  1. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  2. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  3. UNIX环境高级编程(第三版 源码及编译好的静态库文件)

    UNIX环境高级编程(第三版) 源码 及 库文件 链接: https://pan.baidu.com/s/1tPY17lWNDEbzkOwZaRUUNg 提取码: 1024 复制这段内容后打开百度网盘 ...

  4. UNIX环境高级编程-第三版

    Unix环境高级编程-第三版 之前学习了<Linux系统编程>对于常见的概念和函数都有了基础的认知,这里准备通过这本书,深入学习系统API相关内容.笔记内容会有所倾向,不会严格反应书本内容 ...

  5. 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3

    Referred Blogs 文件描述符标志,文件状态标志 Linux中文件描述符fd和文件指针flip的理解 Linux编程–文件描述符fd 文件共享 Unix支持在不同进程间共享文件. 内核使用了 ...

  6. 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2

    Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...

  7. 开发日记-20190828 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 4

    Part 1 文件与目录 设置用户ID和设置组ID 与一个进程相关联的ID有6个或更多. 实际: 实际用户ID/实际组ID 我们实际上是谁 有效: 有效用户ID/有效组ID/附属组ID 用于文件访问权 ...

  8. unix环境高级编程第三版源代码编译及使用

    估计好多学习unix/linux的程序员都知道有这么一本书,最近笔者也开始膜拜膜拜此书,在编译源代码的时候,遇到了一些问题,现在在这里做下总结,加深自己的印象,或许也有遇到此问题的同仁,可以参考参考! ...

  9. 开发日记-20190902 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 7

    读目录 对某个目录具有存取许可权的单一用户都可读该目录,但是只有内核才能与目录(防止文件系统发生混乱).一个目录的写许可权位和执行许可权位决定了在该目录中是否能够创建新文件以及删除文件,它们并不表示能 ...

  10. 开发日记-20190820 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 1

    Part 1:fork创建一个子进程过程 在父进程调用fork创建一个子进程.新进程是调用进程的复制品,故称调用进程为父进程,新创建的进程为子进程.fork对父进程返回非负进程ID,对子进程返回0.因 ...

最新文章

  1. 一文详解NDT算法实现
  2. memcached 与 mysql_memcached 和 MySQL 的 query ?
  3. 叮咚,系统检测到 npm 有更新,原理揭秘!
  4. 解决使用MinGW编译C++代码报cannot find -lxxxx的问题
  5. 全国高等学校计算机等级用处,全国计算机等级考试一级有什么用
  6. as3调用java_java与as3.0中for each使用的小陷阱
  7. android知识杂记(一)
  8. webservice系统学习笔记8-简单的权限校验
  9. SocksCap64全局代理设置
  10. 几种常用英文信件范文
  11. java 读取本地配置文件 Properties
  12. 如何将原来Eclipse的一个工作空间设置好的界面复制到另外一个Eclipse里面
  13. AI+社区智能管理,赋能智慧城市人情共「智」
  14. S5PV210 | S5PV210上进行Linux开发
  15. 25个技巧和诀窍可以用来提高你的app性能
  16. 【转】企业微信自动打卡设置
  17. 自动控制原理-频率特性 G(jw ) 定义
  18. Jenkins免密码登录
  19. 步进电机替换伺服电机如何计算?
  20. Refer to Hibernate 3.6 Migration Guide

热门文章

  1. IE6layout元素自动包含浮动元素
  2. [转] PHP之soap: soap使用例子
  3. Postman 根据nginx日志查账号
  4. 撤销commit且未push操作的git命令
  5. js 中时间格式化的几种方法
  6. 计算机网络TCP与UDP的区别
  7. ajax-登陆+验证码
  8. Android studio 中使用xUtils报错
  9. Excel2007中插入页眉和页脚
  10. 拿什么奉献给你,我的敏感信息(转)