现在的位置: 首页 > 综合 > 正文

sys_pipe()创建管道

2013年09月15日 ⁄ 综合 ⁄ 共 1006字 ⁄ 字号 评论关闭

int sys_pipe(unsigned long *fildes)  //向fildes数组中返回两个文件句柄,一个用于管道写一个用于管道读

{

    struct m_inode *inode;

    struct file *f[2];

    int fd[2];

    int i,j;

 

    j = 0;

    for(i=0;j<2&i<NR_FILE;i++)

        if(!file_table[i].f_count)

              (f[j++]=i+file_table)->f_count++;

    if(j=1)

        f[0]->f_count = 0;

    if(j<2)

        return -1;

 

    j = 0;

    for(i=0;j<2&i<NR_OPEN;i++)

        if(!CURRENT->filp[i])

             CURRENT->filp[fd[j]=i] = f[j];  //将搜索到的文件结构,赋值给当前进程为被使用的文件结构,并对文件句柄赋值

             j++;

    if(j=1)

             CURRENT->filp[fd[0]] = NULL;

    if(j<2) //如果没有找到两个空闲文件句柄,则释放前边找到的文件结构

              f[0]->f_count=f[1]_f_count=0;

    //到这里文件结构和文件句柄都已经找到了,该申请节点

    if(!(inode = get_pipe_inode()))

         CURRENT->filp[fd[0]]=CURRENT->filp[fd[1]]=NULL;

         f[0]->f_count=f[1]_f_count=0;

         return -1;

    //这里如果申请到节点,则对文件结构进行初始化

    f[0]->f_inode=f[1]->f_count=inode;

    f[0]->pos=f[1]->pos=0;

    f[0]->f_mode = 1; //一个设置成读,一个设置成写

    f[1]->f_mode = 2;

    put_fs_long(fd[0],0+fileds); //想用户空间返回两个文件句柄

    put_fs_long(fd[1],1+fileds);

    return 0;

}

 

 

 

}

抱歉!评论已关闭.