for(wstart=0;wstart { *(pipecb3575[pf].p_addr+offw%PSIZE) = *ca; ca++; offw++; } file[w].f_offset = offw;/*重定位写指针位置*/ n1 = n1-m;/*剩余需要读的字符个数*/ printf(\ pthread_cond_signal(&rflag);/*唤醒读线程,管道可读*/ printf(\waiting\\n\ pthread_cond_wait(&wflag,&lock);/*写线程封锁等待*/ } } /*一次性可将ca中内容全部写入管道*/ offr = file[r].f_offset; offw = file[w].f_offset; for(wstart=0;wstart /*printf(\ *(pipecb3575[pf].p_addr+offw%PSIZE) = *ca; /*printf(\ ca++; offw++; } file[w].f_offset = offw; pthread_cond_signal(&rflag); printf(\ pthread_mutex_unlock(&lock); printf(\pipe\\n\ return n;/*返回写入字符个数*/ } /*读管道*/ int numread_simulate3575;_inode;/*读管道对应的pipecb3575表的下标*/ int rstart = 0;/*计数器,读出字符个数*/ int i = 0; for(i;i if((file[i].f_flag=='w')&&(file[i].f_inode==pf)) { w = i; break; } else { continue; } } printf(\ pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr = file[r].f_offset;/*赋值读指针*/ offw = file[w].f_offset;/*赋值写指针*/ if(offr==offw)/*管道空,无内容可读*/ { printf(\ if(pipecb3575[pf].p_count==1)/*写端关闭*/ { pipecb3575[pf].p_count--;/*文件的复制以完成,释放管道文件的空间*/ printf(\finished\\n\ return 0; } else { printf(\writable\\n\ pthread_cond_signal(&wflag);/*唤醒写线程,管道可写*/ printf(\waiting\\n\ pthread_cond_wait(&rflag,&lock);/*读线程封锁等待*/ } } offr = file[r].f_offset; offw = file[w].f_offset; m = n<=(offw-offr)?n:(offw-offr);/*得到可读字符个数*/ for(rstart=0;rstart *ca = *(pipecb3575[pf].p_addr+offr%PSIZE); ca++; offr++; } file[r].f_offset = offr;/*重定位读指针位置*/ printf(\ pthread_cond_signal(&wflag); printf(\ pthread_mutex_unlock(&lock); printf(\memory *ca\\n\ return m; } /*线程调用,读源文件,写管道*/ void *pwrite3575(void *a)_inode].p_count--;/*文件已读完,关闭管道写端*/ } else { perror(args->fname);/*打开源文件可能不成功*/ return NULL; } printf(\into pipe\\n\ return NULL; } /*线程调用,写目标文件,读管道*/ void *pread3575(void *a)name=argv[1];/*源文件名*/ args[0].f=fd[1];/*管道文件写端*/ args[1].fname=argv[2];/*目标文件名*/