UNIX IO小结
来源:互联网 发布:nginx 入门指南 pdf 编辑:程序博客网 时间:2024/06/03 00:34
UNIX 文件IO
1.引言:
UNIX 文件I/O是不带缓冲的I/O。
术语不带缓冲是指每个read和write都调用内核中的一个系统调用。不过虽然UNIX I/O函数没有提供缓冲机制,但操作系统的对磁盘文件的访问都有缓冲机制。
经常用到的I/O操作有:打开(或创建)、写、读、读和写、设置文件偏移量和关闭文件。
当涉及到多进程的时候,也会有文件共享的问题。
2.文件描述符
当打开或创建一个文件时,内核想进程返回一个文件描述符(非负整数),文件I/O函数通过这个文件描述符来操作文件。内核也把文件描述符记录为对一个文件的引用。所以文件描述符是一个进程对一个已打开文件的标识和访问媒介。
2.1标准输入、标准输出和标准出错
每当运行一个程序时,shell都会为其打开三个文件描述符:标准输入、标准输出和错误输出。默认情况下这三个描述符都关联到终端。可以将其重定向到指定文件。
这三个描述符的取值一般为0、1、2。在程序中我们应该用符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常量定义在<unistd.h>头文件中。
3.常用的文件I/O函数
open打开或创建一个文件。可以指定各种参数来表示访问方式。
read和write可以一次读写指定的字节数。read的返回值是实际独到的字节数。
lseek用来设置文件偏移量。
close关闭文件。
4.文件共享
多个线程或进程对同一文件操作就会有文件共享的问题。比如两个进程同时对一个文件写操作,会不会一个进程写的内容把另一个进程写的内容覆盖呢?内核管理文件的方法和文件共享的方式紧密联系。
4.1内核用于管理打开文件的三种数据结构。
(1)内核负责在进程表中为为每个进程维护一个打开文件描述符表,可以视其为一个矢量表没个文件描述符占用一项。与每个文件描述符相关联的是:
(a)文件描述符标志(close_on_exec)。(记住它不是文件描述符)
(b)指向一个文件表项的指针。
(2)内核为所有打开文件维持一张文件表。每个文件表项包含:
(a)文件状态标志(读、写、追加写、同步和非阻塞等)。
(b)当前文件偏移量。
(c)指向该文件v节点表项的指针。
(3)(v节点表)每个打开文件(或设备)都有一个v节点结构。v节点包含文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点。这些信息是在打开文件时从磁盘上读入内存的,所以所以关于文件的信息都是可供快速使用的。例如,i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件实际数据块在磁盘上所有位置的指针等等。
下图显示了三张表之间的关系。可以看出文件描述符就是文件描述符表的偏移量(也可以形象的理解为下标)
下图为两个不通进程同时打开同一文件的情况:
从上图可以看出两个进程两个文件描述符有不同的文件描述符标志、不同的文件状态标志、不同的文件偏移量,但指向相同的v节点表。
- UNIX IO小结
- IO小结
- IO小结
- IO小结
- IO小结
- UNIX 终端IO
- 【UNIX】IO复用
- UNIX 终端IO
- unix之文件IO
- Unix下五种IO模型
- Linux / Unix IO
- Unix下五种IO模型
- unix IO笔记
- UNIX 终端IO
- UNIX 常用IO函数
- 【UNIX】什么是标准IO
- UNIX 终端IO
- UNIX标准IO
- erlang & php 操作mysql的效率测试
- Parallel scan in HBase
- 黑马程序员-------Java继承上
- eclipse启动无响应,停留在Loading workbench状态
- IOS 理解iPhone项目的BaseSDK和DeploymentTarget含义
- UNIX IO小结
- C++ 调试技巧
- 字符转义
- Android开发教程之--sql语句
- 求二进制数中1的个数
- Android 4.0 开机自动启动
- 修复Linux系统中Firefox Backspace不能后退
- mysql数据库中表属性的操作
- 命令行关闭进程