码迷,mamicode.com
首页 > 其他好文 > 详细

文件I/O之-打开文件在内核中的表示

时间:2014-08-20 00:04:45      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   使用   os   strong   文件   数据   

在unix系统中,一切皆文件。系统把目录、字符设备、块设备、套接字都当做文件来对待。对于文件的操作,使用I/O函数,这里所说的I/O函数是指系统调用。大多数文件的I/O要用到这5个函数:open、read、write、lseek、close。这5个函数均是不带缓冲的I/O。


打开文件在内核中的表示

对于打开的文件,都是通过文件描述符来描述。一个没打开的文件调用open打开后,就会返回一个文件描述符。文件描述符是一个非负整数,标准输入、标准输出、标准出错对应的文件描述符分别为0、1、2,它们常常用符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO描述。

在内核中,使用三种数据结构来描述一个打开的文件。

1、每个进程在进程表中都有一个记录项,记录项中有一个打开的文件描述符表,可以将其视为一个矢量,每个描述符占一项。记录着文件描述符标志和指向一个文件表项的指针。

2、内核为所有打开的文件维持一张文件表,表中包含文件状态(读、写、添写、同步和非阻塞等)、当前文件偏移量、指向该文件v节点表项的指针。

3、每个打开的文件都有一个v节点(v-node)结构。v节点包含了文件的类型和对此文件各种操作的函数指针。

bubuko.com,布布扣

每个进程都有自己的文件表项,这是如果两个进程打开同一个文件的话(一个在文件描述符3上面打开,另一个在文件描述符4上面打开),会有如下现象:

bubuko.com,布布扣

当两个进程同时对这个文件操作时,假设先定位lseek,在写入write,由于这是两个操作,所以可能会产生意想不到的结果。比如执行顺序如下:

进程1:lseek

进程2:lseek

进程3:write      此时进程1的lseek可能就失效了,但进程1不知道

进程1:write     写入的位置可能和预想的不一样了

这时就需要进程间的同步了。


下面看两道重定向的题目:

./a.out  >outfile  2>&1

上面表示标准输出与标准出错一起重定向到outfile。因为./a.out把标准输出重定向到outfile,之后2>&1标准出错重定向到标准输出(这时标准输出已经重定向到outfile)

./a.out  2>&1  >outfile

上面表示标准输出重定向到outfile,而标准出错仍在终端。因为2>&1表示把标准出错重定向到终端,1>outfile表示把标准输入重定向到outfile。标准出错在标准输出重定向之前已经重定向了。

文件I/O之-打开文件在内核中的表示,布布扣,bubuko.com

文件I/O之-打开文件在内核中的表示

标签:style   blog   http   使用   os   strong   文件   数据   

原文地址:http://blog.csdn.net/kangroger/article/details/38689369

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!