Unix高级环境编程 学习小结(一)

这个系列的博客主要是针对Unix高级环境编程的内容做一个小结,针对的是面试中经常问道或者可能问到的问题。

Unix体系结构:

环境的核心是内核,内核的接口被称为系统调用,公用函数库建立在系统调用接口只上,应用程序既可使用系统调用,也可以使用公用函数库。Shell是一个特殊的应用程序,为运行其他程序提供了接口。

Shell有很多种,最常用的是/bin/sh下面的Shell。

输入输出:

文件描述符:通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件,打开文件或创建文件的时候都会返回文件描述符。

标准输入、输出、错误:每当一个新程序运行时,Shell都会为其打开三个文件描述符,负责输入,输出,和错误。这三个描述符都链接向终端。可以使用>  <等符号重定向流。

不带缓冲的IO:函数open,read,write,lseek,close提供了不带缓冲的IO,稍后会写细节。

标准IO:常见的是Printf,getc,putc。

文件I/O:

函数open和openat:

用户打开文件,参数为路径,和flag

flag参数主要制定打开方式,如只读,只写,追加等等非常非常多的操作,具体使用和详解可以查表。

openat的使用方法一样,只是openat可以使用相对路径打开文件,open只能使用绝对路径。

函数lseek:

每个打开的文件都有与其相关的文件偏移量,他通常是一个非负整数,用以度量从文件开始处计算的字节数。同样,调用该方法时也需要传递flag参数,根据不同的情况设置不同的偏移量。

Unix文件系统:

内核使用三种数据结构表示打开文件,他们之间的关系决定了在文件共享方面的一个进程对另外一个进程可能产生的影响

(1)每个进程在进程表中都有一个记录项,记录项中包含一张打开的文件描述符的表,可将其视为一个矢量,每个描述符占用一项,与每个文件描述符相关联的是:

  a.文件描述符标志。

  b.指向一个文件表项的指针。

(2)内核为所有打开的文件维持一张文件表,每个文件表项包含:

  a.文件状态标志(读,写,追加写,同步,非阻塞等)

  b.当前文件偏移量

  c.指向该文件v节点表项的指针

(3)每个打开的文件(设备也算),都有一个v节点结构,v节点包含了文件类型和对此文件进行各种操作函数的指针,对于大多数文件,v节点还包含了该文件的i节点(i-node 索引结点)。这些信息是在打开文件时从磁盘上读入内存的,所以,文件的所有相关信息都是随时可用的,例如,i节点包含了文件的所有者,文件长度,指向文件的实际数据块在磁盘上的所在位置的指针等。

黏着位:

  程序第一次被执行后,在终止时,如果设置了该黏着位,会在内存中保存一份副本,下次执行时能更快载入内存。

原文地址:https://www.cnblogs.com/derek-dhw/p/11096224.html