《Unix 高级环境编程》 朝花夕拾

曾经读过Unix 高级环境编程,但是对于好多东西已经忘记,再次去读,希望查漏补缺,朝花夕拾。所以写这个仅作个人学习记录所用。

时间值

长期以来,unix 系统一直使用两种不同的时间值。

    1. 日历时间。该值是自 1970年1月1日 00:00 开始计时,所经过的秒数。这些时间用于记录文件最后一次的修改时间等。系统的基本类型为time_t 用于保留这种时间值。
    1. 进程时间。 这也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以滴答时间计算,系统基本类型为clock_t 用于保存这种时间值。
      当度量一个进程的执行时间上,Unix 系统使用三个进程时间:
      a. 时钟时间。进程运行时间总量。
      b. 用户CPU 时间。执行用户指令所用的时间。
      c. 系统CPU时间。 执行内核调用所用的时间。

文件描述符

对内核来说,所有打开的文件都通过文件描述符引用。它是一个非负整数。一般的unix系统中,把整数0,1,2 分别关联到标准输入,标准输出和标准出错输出相关联。
在程序中用open 调用一般返回的文件描述符一定是最小的未用描述符数值。当然用户可以使用dup2函数进行指定打开的文件描述符的值。

文件共享

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

    1. 每个进程在进程表中都有一个记录项,记录项包含一张打开的文件描述符表。每个描述符占用一项。每个记录条目中包含:
      a. 文件描述符标志。
      b. 指向一个文件表项的指针。
    1. 内核为所有打开的文件维持一张打开文件表,每个文件表条目包含:
      a. 文件标志状态(读,写,同步,非阻塞等)
      b. 当前文件偏移
      c. 指向该文件的v节点表项的指针。
    1. 每个打开文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数指针。对于大部分v节点来说,还包括了一个i节点(用于存储文件的时的一个文件系统结构)。
      Linux 没有使用v节点,而是通用的i节点结构。
      两个独立进程打开同一个文件.png

如果两个进程独立打开同一个文件,我们假定第一个进程在文件描述符3 上打开,另一个在文件描述符4上打开。打开该文件的每个进程都有一个文件表项,但对一个给定的文件只有一个v节点表项。这样设计的好处是,每个进程都有它自己的对该文件的当前偏移量。
所以在操文件的时候,需要有原子操作来保持进程之间的同步。

dup函数

   int dup(int fileds);
   int dup2(int fileds1, int fileds2);

dup 表示复制一个新的描述符,它的返回值就是新的描述符,一般是当前可用最小的一个,它和原来的描述符fileds 指向的文件是同一个。详见图中dup(1).
dup2 函数可以用fileds2 的值来代替返回的新的文件描述符。如果fileds2的文件已经打开,那么先将它关闭,在进行打开;

dup函数.png

sync, fsync, fdatasync

传统的Unix 实现在内核中设有缓冲区高速缓存和页面高速缓存,大多数I/O操作都通过缓冲区进行,当将数据写入文件时,内核通常先将该数据复制到某一个缓冲区中,如果该缓冲区尚未写满,则不将数据排入输出队列。而是将等待其写满或者当内核徐亚重新使用缓冲区时,才把他排入输出队列。这种输出方式成为延迟写
延迟写减少了磁盘读写次数,但是也降低了文件的更新速度,使得欲写入的文件的内容在一段时间诶并没写入磁盘上。Unix提供了fsync的函数来进行实时的同步。

  #include 

  int fsync(int fileds);
  int fdatasync(int fileds); 

  int sync(void);

sync 将所有修改过的缓冲区都排入写队列。

fsync 将fileds 指定的单个文件排入写队列。并且等待写磁盘操作完成,实时更新文件的属性。
fdatasync 和fsync 一样,但是不关心文件的属性部分。

权限

文件的s权限是怎么回事?

包含S_ISUID、S_ISGID两个常量在内,叫做强制位权限,作用在于设置使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份. 典型的文件是passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.

ls -al /usr/bin/passwd
-rwsr-xr-x 1 pythontab pythontab 32988 2018-03-16 14:25 /usr/bin/passwd

t或T(Sticky):

/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。

UFS 文件系统

把一个磁盘分为多个分区,每个分区包含一个文件系统。

磁盘分区和文件系统.png

i节点是固定长度的记录项,它包含有关文件的大部分信息。
如果观察一个柱面组的节点和数据块部分。


i节点和数据块.png

软连接和 硬链接

硬链接:
在Linux文件系统中,多个文件名指向同一个索引节点(inode)。这种情况文件就称为硬链接。硬链接文件就相当于文件的另外的一个入口。删除了一个文件,源文件并没有删除,他还有其他入口。

软连接(符号链接):
类似于windows快捷方式, 删除了指向的那个链接文件后, 快捷方式还存在,但是指向的东西已经没有了。

link, unlink 函数用来创建硬链接, syslink 用来创建一个软连接。

未完待续。。。

你可能感兴趣的:(《Unix 高级环境编程》 朝花夕拾)