Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1557095
  • 博文数量: 157
  • 博客积分: 1776
  • 博客等级: 上尉
  • 技术积分: 1786
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-19 10:49
文章分类

全部博文(157)

文章存档

2018年(1)

2017年(12)

2015年(6)

2014年(17)

2013年(51)

2012年(65)

2011年(5)

分类: 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. 中的FILE流就是一个文件描述符和流缓冲区(stream buffer)的抽象。也就是说这里用标准I/O库fopen的文件已经自己带有缓存。

阅读(1136) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~