多进程间共享资源,原子动作
不带缓冲区的IO read write
shell惯例:
文件描述符0 标准输入
文件描述符1 标准输出
文件描述符2 标准出错输出
open返回的文件描述符一定是最小的未用描述符数值
一个进程终止时,内核自动关闭它所有打开的文件。
关闭一个文件时会释放该进程加在该文件上的所有记录锁。
文件偏移量可以大于文件当前长度,此时,下一次写将加长文件,并在文件中留下空洞。位于文件中但没有写过的字节都被读为0.文件中的空洞并不占用磁盘上的储存区。
read返回读到的字节数,如果达到文件结尾返回0
write操作从文件当前偏移量处开始
对于内核而言,文本文件和二进制代码文件并无区别
所谓的时钟时间又叫做墙上时钟时间,它是进程运行的时钟总量,其值与系统中同时运行的进程数有关,不过一般在讨论时钟时间的时候都是在系统中没有其他活动进行时度量的。
用户cpu时间:就是执行用户指令所用的时间。
系统CPU时间: 所谓的系统,我们知道就是在内核中执行的时间,没错滴,就是该进程执行内核程序所经历的时间。
文件共享:
内核使用三种数据结构表示打开的文件,它们之间的关系决定了再文件共享方面一个进程对另一个进程可能产生的影响。
1.每个进程在进程表中都有一个记录项,及录像中包含一张打开文件描述符表,可以将其视为一个矢量,每个描述符占用一项:文件描述符标志,指向一个文件表项的指针。
2.内核为所有打开文件维持一张文件表,每个文件表项包含:文件状态标志,当前文件偏移量,指向该文件V节点表项的指针。
3.每个打开文件都有一个V节点结构。V节点包含了文件类型和对比文件进行各种操作的函数的指针。对于大多数文件,V节点还包含了该文件的I节点。这些信息是在打开文件时从磁盘上读入内存的。
创建V节点结构的目的是对一个计算机系统上的多文件系统类型提供支持
如果两个进程各自打开同一个文件,则每个进程都有自己的文件表项的一个理由是:这种安排使每个进程都有它自己的对该文件的当前偏移量。
lseek函数只修改文件表项中的当前文件偏移量,没有进行任何I/O操作。
可能会出现多个文件描述符项指向同一文件表项,比如fork后,父子进程对每个打开文件描述符共享同一个文件表项。
原子操作:
unix提供一种方法将“定位到文件尾端,然后写”操作做成了原子操作,该方法时在打开文件时设置O_APPEND标志,这就使内核每次在对这种文件进行写操作之前,都将进程的当前偏移量设置到文件尾端,避免同时写发生覆盖的情况。
使用pread和pwrite相当于顺序调用了lseek和read/write,相当于将这两个操作定义成了原子操作。
4.22 UNIX环境高级编程 笔记,布布扣,bubuko.com
原文:http://www.cnblogs.com/doubi/p/3681451.html