code:pipe - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 系统调用 pipe 的入口
  • 申请管道结构(参看管道)
    • 一个磁盘INODE
    • 一个文件结构 和 一个文件打开结构,用于 读
    • 一个文件结构 和 一个文件打开结构,用于 写
  • 输入/输出
    • 输入两个参数 ,设为 fd[0] fd[1],这两个参数用于输出
    • fd[0] : 返回 用于读的文件打开结构的描述符
    • fd[1] : 返回 用于写的文件打开结构的描述符
    • 参看管道生成时的数据结构

7716

7717 /* The sys-pipe entry.

7718  * Allocate an inode on the root device.

7719  * Allocate 2 file structures.

7720  * Put it all together with flags.

7721  */

7722

7723 pipe()

7724 {

7725     register *ip, *rf, *wf;

7726     int r;

7727

7728     ip = ialloc(rootdev);

7729     if(ip == NULL)

7730          return;

  • 申请 磁盘INODE块,ip
  • 若失败,函数直接返回
7731     rf = falloc();

7732     if(rf == NULL) {

7733          iput(ip);

7734          return;

7735     }

其中u.u_ofile[i]将指向申请的文件打开结构(7749)
  • 若失败,释放ip,函数返回
7736     r = u.u ar0[R0];
用r保护u.u_ar0[R0]
7737     wf = falloc();

7738     if(wf == NULL) {

7739          rf->f_count = 0;

7740          u.u_ofile[r] = NULL;

7741          iput|iput]](ip);

7742          return;

7743     }

其中u.u_ofile[i]将指向申请的文件打开结构(7747)
  • 若失败
    • 释放用于读的文件结构和文件打开结构
    • 释放ip
    • 函数返回
7744     u.u ar0[R1] = u.u ar0[R0];

7745     u.u ar0[R0] = r;

  • 将参数置为
    • u.u ar0[R0] : 用于读的文件打开结构的描述符
    • u.u ar0[R1] : 用于写的文件打开结构的描述符

7746     wf->f_flag = FWRITE|FPIPE;

7747     wf->f_inode = ip;

7748     rf->f_flag = FREAD|FPIPE;

7749     rf->f_inode = ip;

7750     ip->i_count = 2;

7751     ip->i_flag = IACC|IUPD;

7752     ip->i_mode = IALLOC;

7753 }

7754 /* ------------------------- */

Ref

Param

(pipe = 42.)
sys pipe
(read file descriptor in r0)
(write file descriptor in r1)
⚠️ **GitHub.com Fallback** ⚠️