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;
}
}