博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[摘录](2010/03/10)系统级I/O

Posted on 2010-03-10 21:24  xuczhang  阅读(251)  评论(0编辑  收藏  举报

 

今天看了一下csapp的第11章系统级I/O,目的是希望从程序员的角度了解一下I/O部分。结果发现收获不是很大,一方面之前一直在看Understanding Kernel,里面写的非常详细,一些细节部分让我一时难以消化,所以看了csapp的部分,就感觉有些浅,有价值的地方不太多,这里说的主要在Understanding的VFS一章中都涵盖到了。回味一下有这么几个收获,还是记录一下:

1. 描述符表,打开文件表,i-node表

这三张表基本上就能说明linux在操作文件时发生的情况。csapp中列出的三章图最能说明问题(p682).

这里简要说明一下:

描述符表是每个进程一个,记录每个进程打开的文件描述符,如fd0(stdin),fd1(stdout),fd2(stderr),….

这里顺便提一下,fd是一个int型,在打开文件时总是会分配最小的未使用的fd。

打开文件表是所有进程共享的,是用来描述打开的文件的位置和引用次数,比如:

open(“file1.txt”,…);

open(“file1.txt”,…);

这两个打开的文件就是不同的文件,因为它们有不同的文件位置。而引用次数是指可能多个进程的fd会指向同一个打开文件,比如使用重定向时就会发生这种情况。

i-node表就就是表示真实的文件,i-node就是linux用来描述文件元信息的一种结构。

在上述设计之下就可以比较容易的实现文件的重定向,父子进程继承打开文件和文件共享。dup2是用来做重定向的函数:

dup2(int oldfd,int newfd);这里就是将newfd指向的位置指向oldfd指向的位置。如果newfd指向的打开文件为0了,就回收这个打开文件和相应的i-node

 

2. <stdio.h>中的FILE流就是一个文件描述符和流缓冲区(stream buffer)的抽象。也就是说这里用标准I/O库fopen的文件已经自己带有缓存。