一.shell的惯例,与内核无关
描述符0作为进程标准输入
描述符1作为进程标准输出
描述符2作为进程标准错误
二.大多数文件I/O只需要用到五个函数
1.open函数
open函数返回的文件描述符一定是最小的未用描述符数值。
2.read函数(在内核执行, 不带缓冲区的I/O函数)
有多种情况可以使读到的字节数少于要求读的字节数
3.write函数(在内核执行, 不带缓冲区的I/O函数)
write函数错误的常见原因是盘已经写满或者超过了给定进程的文件长度限制。
4.lseek函数
lseek仅将当前的文件偏移量记录在内核,它并不引起任何I/O操作。
文件偏移量可以大于文件的当前长度,会在文件中构成空洞,文件中的空洞并不要求在磁盘上占用存储区。
能否创建一个大文件(比如达到指针最大值),依赖底层文件系统的类型
5.close函数
关闭一个文件时会释放该进程加在该文件的所有记录锁。
当一个进程终止时,内核自动关闭它所有打开的文件。
三.当前用户启动的进程可打开的最大文件描述符,可调整
ulimit -a|grep "open files"
四.I/O的效率
按照文件系统文件块大小去读取,系统CPU时间最小
五.文件共享
内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响
1.每个进程在进程表都有一个记录项,记录项中包含有一张打开文件描述符表,与文件描述符相关联的是:
(a)文件描述符标志
(b)指向一个文件表项的指针(文件表的一个数据),父子进程共享一个文件表项
2.内核为所有打开文件维持一张文件表,每个文件表项包括
(a)文件状态标志(读、写、同步、非阻塞等)
(b)当前文件偏移量
(c)指向该文件v节点表项的指针
3.每个打开文件都有一个v节点结构,包含了文件的所有者,文件长度,文件所在设备等信息
当多个进程同时修改一个文件时,通过v节点结构影响其他进程的读写。
unix系统提供了一种方法原子操作方法,就是在打开文件时设置O_APPEND。
七.复制文件描述符,应用场景比如创建子进程的时候
1.可使用dup和dup2函数
2.可以使用fcntl函数
八.缓冲区高速缓存
传统的unix实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,并不会立刻进行实际的I/O,又叫延迟写。
延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间并没有写到磁盘,当系统发生故障时,这种延迟可能会造成文件更新内容的丢失。为了保证磁盘上实际文件系统和缓冲区中内容的一致性,unix系统提供了sync、fsync、fdatasync三个函数
九.fcntl函数可以改变打开的文件的性质,比如下五种功能
1.复制一个现有的描述符
2.获得/设置文件描述符标记
3.获得/设置文件状态标记(比如非阻塞模式)
4.获得/设置异步I/O所有权
5.获得/设置记录锁
描述符0作为进程标准输入
描述符1作为进程标准输出
描述符2作为进程标准错误
二.大多数文件I/O只需要用到五个函数
1.open函数
open函数返回的文件描述符一定是最小的未用描述符数值。
2.read函数(在内核执行, 不带缓冲区的I/O函数)
有多种情况可以使读到的字节数少于要求读的字节数
3.write函数(在内核执行, 不带缓冲区的I/O函数)
write函数错误的常见原因是盘已经写满或者超过了给定进程的文件长度限制。
4.lseek函数
lseek仅将当前的文件偏移量记录在内核,它并不引起任何I/O操作。
文件偏移量可以大于文件的当前长度,会在文件中构成空洞,文件中的空洞并不要求在磁盘上占用存储区。
能否创建一个大文件(比如达到指针最大值),依赖底层文件系统的类型
5.close函数
关闭一个文件时会释放该进程加在该文件的所有记录锁。
当一个进程终止时,内核自动关闭它所有打开的文件。
三.当前用户启动的进程可打开的最大文件描述符,可调整
ulimit -a|grep "open files"
四.I/O的效率
按照文件系统文件块大小去读取,系统CPU时间最小
五.文件共享
内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响
1.每个进程在进程表都有一个记录项,记录项中包含有一张打开文件描述符表,与文件描述符相关联的是:
(a)文件描述符标志
(b)指向一个文件表项的指针(文件表的一个数据),父子进程共享一个文件表项
2.内核为所有打开文件维持一张文件表,每个文件表项包括
(a)文件状态标志(读、写、同步、非阻塞等)
(b)当前文件偏移量
(c)指向该文件v节点表项的指针
3.每个打开文件都有一个v节点结构,包含了文件的所有者,文件长度,文件所在设备等信息
当多个进程同时修改一个文件时,通过v节点结构影响其他进程的读写。
情况一:一个进程打开两个不同的文件
情况二:两个进程打开相同的一个文件
情况三:父子进程打开三个不同的文件
六.原子操作
当多个进程写同一个文件时,则可能产生预期不到的结果,为了避免这种情况,需要理解原子系统操作的概念,unix系统提供了一种方法原子操作方法,就是在打开文件时设置O_APPEND。
七.复制文件描述符,应用场景比如创建子进程的时候
1.可使用dup和dup2函数
2.可以使用fcntl函数
八.缓冲区高速缓存
传统的unix实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,并不会立刻进行实际的I/O,又叫延迟写。
延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间并没有写到磁盘,当系统发生故障时,这种延迟可能会造成文件更新内容的丢失。为了保证磁盘上实际文件系统和缓冲区中内容的一致性,unix系统提供了sync、fsync、fdatasync三个函数
九.fcntl函数可以改变打开的文件的性质,比如下五种功能
1.复制一个现有的描述符
2.获得/设置文件描述符标记
3.获得/设置文件状态标记(比如非阻塞模式)
4.获得/设置异步I/O所有权
5.获得/设置记录锁
参考:《UNIX环境高级编程》
End;