code:pipe - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 系统调用 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 {
7726 int r;
7727
7729 if(ip == NULL)
7730 return;
7731 rf = falloc();
- 申请 磁盘INODE块,ip
- 若失败,函数直接返回
7732 if(rf == NULL) {
7734 return;
7735 }
7736 r = u.u ar0[R0];其中u.u_ofile[i]将指向申请的文件打开结构(7749)
- 申请 一个文件结构rf 和 一个文件打开结构u.u_ofile[i],用于读管道
- falloc 中 置 u.u_ar0[R0] 为 i
- 若失败,释放ip,函数返回
7737 wf = falloc();用r保护u.u_ar0[R0]
- 由于7737 falloc 会改变 u.u_ar0[R0]
7738 if(wf == NULL) {
7739 rf->f_count = 0;
7740 u.u_ofile[r] = NULL;
7742 return;
7743 }
7744 u.u ar0[R1] = u.u ar0[R0];其中u.u_ofile[i]将指向申请的文件打开结构(7747)
- 申请 一个文件结构wf 和 一个文件打开结构u.u_ofile[i],用于写管道
- falloc 中 置 u.u_ar0[R0] 为 i
- 若失败
- 释放用于读的文件结构和文件打开结构
- 释放ip
- 函数返回
7745 u.u ar0[R0] = r;
7746 wf->f_flag = FWRITE|FPIPE;
7748 rf->f_flag = FREAD|FPIPE;
7750 ip->i_count = 2;
7751 ip->i_flag = IACC|IUPD;
7752 ip->i_mode = IALLOC;
7753 }
7754 /* ------------------------- */
- (pipe = 42.)
- sys pipe
- (read file descriptor in r0)
- (write file descriptor in r1)