《UNIX环境高级编程》阅读笔记

这本书后续需要再读一遍

第一章 UNIX基础知识

1、文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。

2、open、read、write、lseek以及close提供了不带缓冲的IO。标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。

3、程序是一个存储在磁盘上某个目录的可执行文件,内核使用exec函数将程序读入 内存,并执行程序。进程是程序的一个执行实例。线程,某一时刻执行的一组机器指令。

4、execlp函数要求的参数是一null结束的而不是以换行符结束的。 

5、用户ID标识不同的用户。组ID,标识不同组。附属组ID允许用户属于多个组。每一个磁盘上的文件都存储该文件所有者的用户ID 和组ID。

6、UNIX的系统调用一般在C库中会有一个同名函数。从实现者的角度看,系统调用和库函数之间有根本的区别,但从用户的角度来看,其区别不重要。应用程序即可以调用系统调用也可以调用库函数。很多库函数则会调用系统调用。

第三章 文件/IO

1、关闭一个文件时还会释放该进程加在该文件上的所有记录锁。

2、通过lseek设置的文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被读作0.但是空洞可能被并不占用磁盘空间。

3、大多数文件系统为改善性能都采用某种预读技术。当检测到正进行顺序读取时,系统就试图读入比应用锁要求的更多的数据。所以在一定情况下,read分配缓冲区32到524288,可能时钟时间相差不大。

4、每一个进程有一个进程表,进程表有一个记录项指向一张文件描述符表,文件描述符对应一个文件表项,文件表项指向一个v节点表项,v节点指向i节点,i节点也指向v节点。多个进程可以打开同一个文件,拥有不同的文件表项,共享相同的v节点和i节点。

5、在完成每个write后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出了当前文件长度,则将i节点表项中的当前文件长度设置为当前文件偏移量。lseek函数只修改文件表项中的当前文件偏移量,不进行任何IO操作。

6、pread和pwrite可以实现原子操作。

7、 FD_CLOEXEC 标志,进程中每个打开描述符都有一个执行时关闭标志。若此标志设置,则在执行 exec 时关闭该描述符,否则该描述符仍打开。除非特地用 fcntl 设置了该标志,否则系统的默认操作是在执行 exec 后仍保持这种描述符打开。

第四章 文件和目录

1、用户ID、有效ID,参考:linux下进程的实际用户ID(有效组)和有效用户ID(有效组ID)

2、用户可以设置umask值以控制他们所创建文件的默认权限。该值表示成八进制数,一位代表一种要屏蔽的权限。

第七章、进程环境

1、函数atexit,一个进程可以登记多至32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数。

2、C程序的存储空间布局:(1)正文段、即代码段、存放指令可共享(2)初始化段、在代码中初始化的全局变量。(3)未初始化段、代码中未初始化的全局变量,有内核初始化为0或空指针。(3)堆、动态分配空间。(4)栈、自动变量以及每次函数调用时所需保存的信息都存放在此段。栈和堆的增长方向相反。参考:Linux下C程序的存储空间布局

3、共享库、大多数UNIX系统支持共享库,用动态链接的方式将程序与共享库函数相链接。

4、虽然sbrk可以扩充或缩小进程的存储空间,但是大多数malloc和free的实现都不减少进程的存储空间。释放的空间可供以后再分配,但将他们保持在malloc池中而不返回给内核。

5、大多数实现所分配的存储空间比所要求的要稍大一点,额外的空间用来记录管理信息。这意味着,如果超过一个已分配区的尾端或起始位置之前进行写操作,则会改写一些管理信息,这种类型的错误是灾难性的。

6、环境表(指向实际name=value字符串的指针数组)和环境字符串通常存放在进程存储空间的顶部(栈之上)。并且空间长度不能增加。如果需要更多的空间只能调用malloc重新分配空间,并将environ指向新指针表。

7、goto语句是不能跨越函数的。但是setjmp和longjmp可以。但是大多数实现并不回滚这些自动变量和寄存器变量的值。

第八章、进程控制

1、ID为0的进程通常是调度进程,常常被称为交换进程。该进程是内核的一部分。进程ID为1通常是init进程,在自举过程结束后由内核调用。

2、可移植的应用程序不应该使用vfork,vfork保证子进程先运行

3、不管进程如何终止,最后都会执行内核中的同一段代码,这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器。内核为每个终止子进程保存了一定量的信息,所以当终止进程的父进程调用wait或waitpid时,可以得到这些信息。一个已经终止,但是其父进程尚未对其进行善后处理的进程被称为僵死进程。

4、exec只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。

你可能感兴趣的:(Linux,C++,读书笔记)