学习过文件的I/O操作,也许你我都用过open等等函数,但有的时候,你有试过同时调用两个open函数吗?两个进程同时操作同一个文件吗?还有文件I/O重定向有玩过吗?很多问题其实平时都没有去深究。前几个月买了本英文版的《Computer Systems A programmer's Perspective》,看到文件共享一节,真是大有收获啊,我不的不佩服作者,真是太太太牛了,不止这些,其他内容,还有作者善于从程序例题分析理论的方法,真是一本绝好的自修书!买这本书也是个偶然的机会,但是很值的。建议大家买来看看。
以下内容来自此书,翻译不对或者理解错误的地方还望纠正,谢谢!先来看个图:(chinaunix画图????还真不知道怎么画,知道的也告诉我好吗!)
在图中有三个表,当一个进程Open一个文件时,返回一个fd,这个fd就是文件描述符。图中打开了两个文件file A 和 file B。打开文件表中保存了文件指针和还有一个引用数(refcnt)。这个引用数很好理解,一个文件可以被都个进程打开嘛。接下来这个v-node其实就是stat结构,保存了文件的一些属性等等。
下面看一段程序,这个程序对一个文件打开两个open。
/*
* =====================================================================================
*
* Filename: open.c
*
* Description: This program run open function twice.
*
* Version: 1.0
* Created: 05/04/2010 06:38:05 PM
* Revision: none
* Compiler: gcc
*
* Author: L.U. (cn), tryanswer@gmail.com
* Company: STUDENT OF USST/ECUST
*
* =====================================================================================
*/
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
* === FUNCTION ======================================================================
* Name: main
* Description:
* =====================================================================================
*/
int main ( int argc, char *argv[] )
{
int fd1, fd2;
char c;
fd1 = open("linux",O_RDONLY);//linux文件内容是linux
fd2 = open("linux",O_RDONLY);
read(fd1,&c,1);
read(fd2,&c,1);//对同一个文件读了两次
write(2,&c,1);//输出结果是什么了?2是输出到终端,宏我没记住,看了内核1是stdin,2是stdout,3是stderr
return EXIT_SUCCESS;
}
/* ---------- end of function main ---------- */
|
输出结果是什么了,弄明白了上面那个图自然明白是
"l"。贴个图看看吧。
![](http://blog.chinaunix.net/photo/113325_100504185748.png)
这是我的理解,可能有误哦!!!从图中可以看出文件指针不一样,当然输出结果就是“l”了。
再来看下两个进程open(父子)同一个文件:
/*
* =====================================================================================
*
* Filename: open1.c
*
* Description: Parent and child processes open file!
*
* Version: 1.0
* Created: 05/04/2010 07:02:36 PM
* Revision: none
* Compiler: gcc
*
* Author: L.U. (cn), tryanswer@gmail.com
* Company: STUDENT OF USST/ECUST
*
* =====================================================================================
*/
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
* === FUNCTION ======================================================================
* Name: main
* Description:
* =====================================================================================
*/
int
main ( int argc, char *argv[] )
{
int fd;
char c;
fd = open("linux",O_RDONLY,0);
c = read(fd,&c,1);
if(fork()==0){
read(fd,&c,1);
}
wait(NULL);
write(2,&c,1);
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
|
输出结果是什么了?
应该是"i"了。为什么?看下面一个贴图。
![](http://blog.chinaunix.net/photo/113325_100504191214.png)
当fork创建一个子进程时,子进程继承了父进程的所有可以继承的东西。当然包括了文件描述符!所以,你应该明白了输出结果为什么是“i"。
文件重定向:
/*
* =====================================================================================
*
* Filename: open2.c
*
* Description: 文件I/O重定向
*
* Version: 1.0
* Created: 05/04/2010 07:19:54 PM
* Revision: none
* Compiler: gcc
*
* Author: L.U. (cn), tryanswer@gmail.com
* Company: STUDENT OF USST/ECUST
*
* =====================================================================================
*/
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
* === FUNCTION ======================================================================
* Name: main
* Description:
* =====================================================================================
*/
int
main ( int argc, char *argv[] )
{
int fd1,fd2;
char c;
fd1 = open("linux",O_RDONLY,0);
fd2 = open("linux",O_RDONLY,0);
read(fd1,&c,1);
dup2(fd1,fd2);//fd2 = fd1;
read(fd2,&c,1);
write(2,&c,1);
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
|
输出结果为"i".看了下面的贴图一眼就可以看明白。
![](http://blog.chinaunix.net/photo/113325_100504192847.png)
虚线表示开始指向!
本来还想深入挖掘点东西,chinaunix贴图太太太太垃圾了!算了,去别的博客玩玩
有错误的地方告知我哈。我的邮箱tryanswer@gmail.com。代码注释里也有的,感谢c.vim!
阅读(437) | 评论(0) | 转发(0) |