Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59447
  • 博文数量: 32
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-28 21:50
文章分类

全部博文(32)

文章存档

2011年(1)

2010年(6)

2009年(25)

我的朋友

分类: LINUX

2009-12-22 18:29:54

  • 本章主要内容:进程间通信的一种特殊方式:I/O重定向与管道的概念,作用,实现。dup(),dup2(),pipe()

  • 两个重要概念:
    1、所有的Unix进程都使用文件描述符0、1和2,0表示stdin,1表示stdout,3表示stderr,默认是连接到终端
    2、文件描述符的概念:文件描述符是一个数组的索引号,记录着与进程连接的文件,每个进程都有这样的一个数组。
    最低可用文件描述符概念:当进程为了连接文件请求一个新的文件描述符时,内核将最低可用的文件描述符赋给它。

  • 程序只会不断的读与写,它们不知道数据流的来源与去向,所以,使I/O重定向的是shell,而不是程序本身

  • 将stdin定向到文件的方法:
    1、close then open:close(0),即将标准输入的连接挂断;使用open(filename,O_RDONLY)打开一个文件,则由于当前最低可用描述符为0,因此所打开的文件就连接到标准输入上去
    2、open..close..dup..close
    (1)open(file),打开stdin要重定向的文件,返回的是一个最低可用文件描述符fd
    (2)close(0),挂断文件描述符0与终端的连接。
    (3)dup(fd),将文件描述符fd进行复制,则此时使用的是打开最低可用文件描述符0,即这时,文件描述符fd与0都连接到文件file
    (4)close(fd),关闭文件file的原始连接,只留下文件描述符fd与文件file的连接
    3、open..dup2..close
    跟方法2一样。只不过dup2会完成(2)(3)步

  • shell通过fork产生子进程与子进程调用exec之间的时间间隔来使子进程重定向标准输入,输出到文件

  • 管道是内核中的一个数据队列,非文件,单向通信,其每一端连接一个文件描述符。程序通过使用pipe(int array[2])来创建管道,array[0]为读数据端的文件描述符,array[1]则为写数据端的文件描述符,pipe调用也使用最低可用文件描述符原则,管道读到文件结尾标志的惟一途径是将写数据端关闭

  • 当父进程调用fork的时候,管道的两端都被复制到子进程,即父子进程共享管道,这样,父子进程就可以通过管道通信。

  • 本章的系统调用:
    #include
    dup,dup2    //复制文件描述符
    #include
    pipe(int array[2])    //创建管道

  • 命令
    comm   找出两个文件共有的行
阅读(405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~