1.I/O
- 输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程
- 高级别I/O函数,包括scanf和printf,«和»,以及使用系统级I/O函数实现
- 一个Unix 文件就是一个m个字节的序列:
- 所有I/O设备都被模型化为文件
- 而所有的输入和输出都被当做相应文件的读和写
2.文件
- 为了区别不同文件的类型,会有一个 type 来进行区别
- 普通文件: 包含任意数据
- 目录: 相关一组文件的索引
- 套接字 Socket: 和另一台机器上的进程通信的类型
- 打开和关闭文件
每个由 Linux shell创建的进程都会默认打开三个文件:
- standard input(stdin)-标准输入文件-0
- standard output(stdout)-标准输出文件-1
- standar error(stderr)-标准错误文件-2
- 所以用户打开的文件的最小进程号是3
- 内核用三个相关的数据结构来表示打开的文件
-
描述符表 每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项
-
文件表 打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。每个文件表的表项组成包括当前的文件位置、引用计数refcnt(即当前指向该表项的描述符表项数),以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的引用计数。内核不会删除这个文件表表项,直到它的引用计数为零
-
v-node表 同文件表一样,所有的进程共享这张v-node表。每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员
3.重定向
-
I/O重定向功能: 允许用户将磁盘文件和标准输入输出联系起来
-
使用dup2函数,
int dup2(int oldfd,int newfd);
-
若成功则为非负的描述符,若出错则为-1。
-
dup2函数拷贝描述符表表项 oldfd 到描述符表表项 newfd ,覆盖newfd。
-
如果newfd已经打开,dup2函数会在拷贝oldfd之前关闭newfd