分类: LINUX
2013-04-12 10:19:27
今天看了一下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.