pfile = (char *)malloc(PSIZE*sizeof(char));/*申请模拟管道用的内存空间*/
if(pfile==NULL)/*申请可能不成功*/ {
printf(\ return -1; }
for(i=0;i if(file[i].f_count!=1) { file[i].f_flag = 'r';/*读标志*/ _inode = 0;/*读对应pipecb3575表下标*/ file[i].f_count = 1;/*file[0]这个表项在被使用,不可再分配*/ file[i].f_offset = 0;/*读指针*/ u_ofile3575[a[0]] = i;/*读端*/ break; } } for(i=0;i if(file[i].f_count!=1) { file[i].f_flag = 'w';/*写标志*/ _inode = 0;/*写对应pipecb3575控制块下标*/ file[i].f_count = 1;/*file[1]这个表项在被使用,不可再分配*/ file[i].f_offset = 0;/*写指针*/ u_ofile3575[a[1]] = i;/*写端*/ break; } } if(i>=NFILE) { printf(\ return -1; } for(i=0;i if(pipecb3575[i].p_count==0) { pipecb3575[i].p_addr = pfile;/*给管道文件基地址赋值*/ pipecb3575[i].p_size = PSIZE;/*管道文件大小*/ pipecb3575[i].p_count = 2;/*读写都在进行,此pipecb3575表项不可再分*/ file[u_ofile3575[a[0]]].f_inode = i; file[u_ofile3575[a[1]]].f_inode = i; break; } } if(i>=NPIPE) { printf(\ return -1; } printf(\ return 0;/*分配成功*/ } /*关闭管道*/ int close_simulate3575(int a[]) { printf(\ char *p; int i; for(i=0;i<2;i++) { p=pipecb3575[file[u_ofile3575[a[i]]].f_inode].p_addr; /* if(p!=NULL) free(p); _inode].p_count = 0; /*管道控制块计数清零*/ file[u_ofile3575[a[i]]].f_count = 0; /*file表项计数清零*/ u_ofile3575[a[i]] = -1; /*u_ofile3575表项清空*/ a[i] = -1; /*fdp[]清空?*/ } printf(\ return 0; } /*写管道*/ int numwrite_simulate3575; int write_simulate3575(int fd,char *ca,int n)_inode;/*读管道对应的pipecb3575表的下标*/ int n1 = n;/*一次应该写入的字符个数*/ int wstart = 0;/*计数器,写入字符个数*/ int i = 0; for(i;i if((file[i].f_flag=='r')&&(file[i].f_inode==pf)) { r = i; break; } else { continue; } } printf(\ pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr = file[r].f_offset;/*赋值读指针*/ offw = file[w].f_offset;/*赋值写指针*/ if((offw+n1-PSIZE)>offr)/*不能一次写完*/ { if(pipecb3575[pf].p_count==0)/*对文件的复制操作已进行结束,管道文件被释放*/ { printf(\对文件的复制操作已进行结束,管道文件被释放\\n\ return 0; } else { m = PSIZE+offr-offw;/*最多可写入数*/