[阅读体会] UNIX环境高级编程

版权声明:本文为博主原创文章,未经博主允许禁止转载! https://blog.csdn.net/az9996/article/details/89680387

在这里插入图片描述

写在开始阅读前

  首先,很高兴能阅读这本书
  之前我从未系统的学习过Linux操作系统,因此,在学习过程中,总是会碰到许多的困难,而又没有好的解决途径,一点一点地求助百度,费时费力不说还无法形成完整的知识体系。一直苦恼于该如何去全面系统地学习linux,真心话,这本书解决了我的问题,给了我一个方向让我能从低向高、系统、全面的学习linux。
  虽然这本书的名字叫做unix环境高级编程。但是由于linux是一种类unix系统,所以阅读这本书和我学习linux并不存在冲突。此外,这本书在计算机领域享有盛名,是不能错过的一本书。
书中的示例都是同时支持Free BSD 8.0、Linux 3.2.0、Mac OS 10.6.8、Solaris 10四种系统,因此无论是出于学习哪种系统,阅读这本书都是OK的。
  这本书和C语言密切联系,因此阅读时要有一定的C语言基础,从这本书中能够学习到许多C语言书中不会提到的知识点,绝对能把你的C语言水平提升到新的层面。

PS:之前一直苦恼于书读过之后会忘记,某天,灵机一闪,在阅读时把体会记录下来不就好了,还能加深印象!于是最近就开始了把将要读的书、已经读过的书,在阅读过程中记录体会的工作。也就是我的博客分类里新添加了“我阅读的书”这一分类。

(我会的知识点,在体会里是不提的,并不是书中没有,这里着重于记录我之前不会的,但读过书之后学会的。)

第一章

1、非常全面的介绍了UNIX基础知识,你想要知道的所有基础知识都可以在这一章中学习的。
2、出错处理也是我的一个盲点在这本书中,我对其有了一个清晰的认识。
3、之前我对用户标识,用户ID、组ID、附属组ID之间的关系理解的不好,这本书就讲的很好。
4、信号,这一节也让我收获许多。
5、系统调用和库函数,之前我一直不清楚他们之间的区别,但是在这本书中讲的非常的清楚明白。

第二章

2.1、C语言的标准化经历了哪些阶段?,在这本书中也讲得很清楚。
2.2、以前在学习c语言的时候,一直不清楚库文件都有哪些?每个库文件的作用是什么?在这里我学会了。
2.3、C语言的标准化提高了C程序的可移植性。
  ISO C、POSIX、XSI、SUS
XSI选项描述了可选的接口,也定义了遵循XSI(XSI conformiing)的实现必须支持POSIX.1的哪些可选部分。这些必须支持的部分包括:文件同步、线程栈地址和长度属性、线程进程共享同步以及_XOPEN_UNIX符号常量。只有遵循XSI的实现才能称为UNIX系统
2.4、统一的标准,不同的实现。
标准只是接口的规范,标准由厂商采用,然后转变为具体实现
2.5、限制这一节是我的盲点,在这里被点亮了。
  编译时限制在头文件中定义(例如<limits.h>);
  运行时限制则要求进程调用一个函数获得限制。sysconf、pathconf、fpathconf
  限制确保实现是符合标准的
2.6、选项
  这些限制在POSIX .1、XSI选项组中定义。如果我们编写可移植的应用程序,而这些程序可能会依赖于这些可选支持的功能,那么就需要一种可移植的方法来判断实现是否支持一个给定的选项。
POSIX .1定义了3种处理选项的方法:
(1)编译时选项定义在<unistd.h>中
(2)与文件或目录无关的运行时选项用sysconf来判断
(3)与文件或目录有关的运行时选项通过调用pathconf或fpathconf函数来判断

2.7、功能测试宏
常量_POSIX_C_SOURCE及_XOPEN_SOURCE被称为功能测试宏(feature test macro)。

SUS将C99实用程序定义为C编译环境的接口。

2.8、基本系统数据类型
某些UNIX系统变量已与某些C数据类型联系在一起。

头文件<sys/types.h>中定义了某些与实现有关的数据类型,它们被称为基本数据类型(primitive system data type)。还有很多这种类型定义在其他头文件中。
在头文件中这些数据类型都是用C的typedef来定义。它们绝大多数都以_t结尾。
用这种方式定义了这些数据类型后,就不再需要考虑因系统不同而变化的程序实现细节。

2.9、标准之间的冲突
SUS基本说明和POSIX.1是同一个东西,所以主要关注ISO C标准和POSIX.1之间的差别。它们之间的冲突并非有意,但如果出现冲突,POSIX.1服从ISO C标准。
另一种可能产生冲突的地方是:在ISO C标准说明函数时,可能没有像PSOSIX.1那样严。

2.10 小结

endtime:2019-05-01-20点25分

第三章

begintime:2019-05-02-12点30分
3.1、理解了术语不带缓冲的I/O(unbuffered I/O),指的是每个read和write都调用内核中的一个系统调用。这些不带缓冲的I/O函数不是ISO C的组成部分,但是,它们是POSIX.1和SUS的组成部分。
只要涉及在多个进程间共享资源,原子操作的概念就变得非常重要。通过文件I/O和open函数的参数来讨论此概念。

3.2、明白对于内核而言,所有打开的文件都通过文件描述符引用。
当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。

按照惯例,unix系统shell把文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准错误相关联。这是各种shell以及很多应用程序使用的惯例,与unix内核无关。尽管如此,如果不遵循这种惯例,很多unix系统应用程序就不能正常工作。

在符号POSIX.1的应用程序中,幻数0、1、2虽然已被标准化,但应把它们替换成符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO以提高可读性。在头文件<unistd.h>中定义。

文件描述符的变化范围是0~OPEN_MAX-1,对于Free BSD 8.0、Linux 3.2.0、Mac OS 10.6.8、Solaris 10以及solaris 10 文件描述符的变化范围几乎是无限的。

3.3、函数open和openat
我只能说,太详细了,随用随查吧。。。

由open和openat函数返回的文件描述符一定是最小的未用描述符数值。
这一点被某些应用程序用来在标准输入、标准输出或标准错误上打开新文件。例如,一个应用程序可以先关闭标准输出(通常是文件描述符1),然后打开另一个文件,执行打开操作就能了解到该文件一定会在文件描述符1上打开。更好的方法是使用dup函数,可以保证在一个给定的描述符上打开一个文件。

fd参数把open和openat函数区分开,共有3种可能性:
(1)
(2)
(3)

openat函数是POSIX.1最新版中新增的一类函数之一,希望解决两个问题:
第一,让线程可以使用相对路径名打开文件目录中的文件,而不再只能打开当前目录。在第11章会看到,同一进程中的所有线程共享相同的当前工作目录,因此很难让同一进程的多个不同线程在同一时间工作在不同的目录中。
第二,可以避免time-of-check-to-time-of-use(TOCTTOU,检查与使用时差)错误。

TOCTTOU错误的基本思想是:如果有两个基于文件的函数调用,其中第二个调用依赖于第一个调用的结果,那么程序是脆弱的。

endtime:13点33分

持续更新,敬请期待!如果无法访问的话,可能是我正在进行编辑。

猜你喜欢

转载自blog.csdn.net/az9996/article/details/89680387