Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40553
  • 博文数量: 21
  • 博客积分: 825
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-06 18:08
文章分类

全部博文(21)

文章存档

2011年(1)

2010年(20)

我的朋友

分类: LINUX

2010-05-02 22:40:22

  学习过文件的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"。贴个图看看吧。


这是我的理解,可能有误哦!!!从图中可以看出文件指针不一样,当然输出结果就是“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"了。为什么?看下面一个贴图。

当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".看了下面的贴图一眼就可以看明白。

虚线表示开始指向!


本来还想深入挖掘点东西,chinaunix贴图太太太太垃圾了!算了,去别的博客玩玩
有错误的地方告知我哈。我的邮箱tryanswer@gmail.com。代码注释里也有的,感谢c.vim!
阅读(437) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~