操作系统试验报告_线程并发拷贝程序_第1页
操作系统试验报告_线程并发拷贝程序_第2页
操作系统试验报告_线程并发拷贝程序_第3页
操作系统试验报告_线程并发拷贝程序_第4页
操作系统试验报告_线程并发拷贝程序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统:线程(进程)并发拷贝程序附录一:程序代码#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<pthread.h>#include<malloc.h>#definePSIZE4096/*管道文件的大小*/#defineBSIZE128#defineNOFILE20#defineNFILE20#defineNPIPE20/*默认缓冲区的大小*/*u_ofi

2、le3705表可分配的个数*/*file表可分配的个数*/*pipecb3705可分配的个数*/*进程的u_file表*/intu_ofile3705NOFILE;/*模才file表*/structcharf_flag;/*读写标志,'w'表示写,r'表示读*/intf_count;/*表示此表项的状态,=0表示此表项没被使用,可分配;=1表示此表项在被使用,不可再分配*/intf_inode;/*对应的pipecb3705表下标*/longf_offset;/*读写指针,当前已读或已写个数*/fileNFILE;/*管道控制块*/structchar*p_addr;/

3、*管道文件基地址*/intp_size;/*管道文件大小,PSIZE*/intp_count;/*=2表示读写都在被进行,=1表示在被读或被写,=0表示管道没被使用,可分配*/pipecb3705NPIPE;/*模拟管道文件*/char*pfile;/*管道的写入写出端*/intfd2;/*锁机制,实现互斥*/pthread_mutex_tlock=PTHREAD_MUTEX_INITIALIZER;/*进程间通信,实现同步*/pthread_cond_trflag=PTHREAD_COND_INITIALIZER;/*读信号量*/pthread_cond_twflag=PTHREAD_CON

4、D_INITIALIZER;/*写信号量*/*线程创建函数只能传一个参数,用结构体来封装所有参数*/structarg_set(char*fname;/*文件名*/intf;/*传递fdp*/);/*u_ofile3705表初始化*/intu_ofile_init3705()(printf("inittheu_ofile3705'n");inti;for(i=0;i<NOFILE;i+)u_ofile3705i=-1;u_ofile37050=0;u_ofile37051=0;u_ofile37052=0;return0;)/*创建管道*/intpipe_si

5、mulate3705(inta)(printf("starttocreateapipen");inti;for(i=0;i<NOFILE;i+)(if(u_ofile3705i=-1)(a0=i;/*读*/u_ofile3705i=0;/*读端*/break;)for(i;i<NOFILE;i+)(if(u_ofile3705i=-1)(a1=i;/*写*/u_ofile3705i=1;/*写端*/break;)if(i>=NOFILE)(printf("u_ofile3705分配失败,failuretocreateapipe'n&quo

6、t;);return-2;)pfile=(char*)malloc(PSIZE*sizeof(char);/*申请模拟管道用的内存空间*/if(pfile=NULL)/*申请可能不成功*/printf("failuretocreateapipen");return-1;)for(i=0;i<NFILE;i+)if(filei.f_count!=1)filei.f_flag='r'/*读标志*/filei.f_inode=0;/*读对应pipecb3705表下标*/filei.f_count=1;/*file0这个表项在被使用,不可再分配*/filei.

7、f_offset=0;/*读指针*/u_ofile3705a0=i;/*读端*/break;)for(i=0;i<NFILE;i+)if(filei.f_count!=1)filei.f_flag='w'/*写标志*/filei.f_inode=0;/*写对应pipecb3705控制块下标*/filei.f_count=1;/*file1这个表项在被使用,不可再分配*/filei.f_offset=0;/*写指针*/u_ofile3705a1=i;/*写端*/break;)if(i>=NFILE)printf("failuretocreateapipen&

8、quot;);return-1;)for(i=0;i<NPIPE;i+)if(pipecb3705i.p_count=0)pipecb3705i.p_addr=pfile;/*给管道文件基地址赋值*/pipecb3705i.p_size=PSIZE;/*管道文件大小*/pipecb3705i.p_count=2;/*读写都在进行,此pipecb3705表项不可再分*/fileu_ofile3705a0.f_inode=i;fileu_ofile3705a1.f_inode=i;break;)if(i>=NPIPE)printf("failuretocreateapipen

9、");return-1;)printf("Secceedcreatethepipen");return0;/*分配成功*/)/*关闭管道*/intclose_simulate3705(inta)printf("starttoclosethepipeyouhavecreatedn");char*p;inti;for(i=0;i<2;i+)p=pipecb3705fileu_ofile3705ai.f_inode.p_addr;/*if(p!=NULL)free(p);/释放管道内存*/*/pipecb3705fileu_ofile3705a

10、i.f_inode.p_count=0;/*管道控制块计数清零fileu_ofile3705ai.f_count=0;/*file表项计数清零*/u_ofile3705ai=-1;/*u_ofile3705表项清空*/ai=-1;/*fdp清空?*/)printf("secceedclosethepipen");return0;)/*写管道*/intnumwrite_simulate3705;intwrite_simulate3705(intfd,char*ca,intn)将内存ca内容写入n个字符到管道fd里printf("(memory->pipe)in

11、putdatainmemory*caintopipen");numwrite_simulate3705+;longoffr,offw;/*读写指针,实际是读写字符个数*/intr;/*管道文件读端*/intm;/*若ca中的字符不能一次写完,m用来表示一次可写入的字符的最大数*/intw=u_ofile3705fd;/*管道文件写端*/intpf=filew.f_inode;/*读管道又力的pipecb3705表的下标*/intn1=n;/*一次应该写入的字符个数*/intwstart=0;/*计数器,写入字符个数*/inti=0;for(i;i<NFILE;i+)/*寻找写管

12、道对应的读管道的读端*/if(filei.f_flag='r')&&(filei.f_inode=pf)r=i;break;elsecontinue;printf("-addthelock'n");pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/offr=filer.f_offset;/*赋值读指针*/offw=filew.f_offset;/*赋值写指针*/if(offw+n1-PSIZE)>offr)/*不能一次写完*/*/if(pipecb3705pf.p_count=0)/*对

13、文件的复制操作已进行结束,管道文件被释放printf("对文件的复制操作已进行结束,管道文件被释放n");return0;elsem=PSIZE+offr-offw;/*最多可写入数*/for(wstart=0;wstart<m;wstart+)*(pipecb3705pf.p_addr+offw%PSIZE)=*ca;ca+;offw+;filew.f_offset=offw;/*重定位写指针位置*/n1=n1-m;/*剩余需要读的字符个数*/printf("weakupthereadthread,pipeisreadablen");pthrea

14、d_cond_signal(&rflag);/*唤醒读线程,管道可读*/printf("writethreadisblockedandunderthestatementofwaitingn");pthread_cond_wait(&wflag,&lock);/*写线程封锁等待*/*一次性可将ca中内容全部写入管道*/offr=filer.f_offset;offw=filew.f_offset;for(wstart=0;wstart<n1;wstart+)(/*printf("%dn",pipecb3705pf.p_addr

15、);*/*(pipecb3705pf.p_addr+offw%PSIZE)=*ca;/*printf("%dn",wstart);*/ca+;offw+;filew.f_offset=offw;pthread_cond_signal(&rflag);printf("-releasethelockn");pthread_mutex_unlock(&lock);printf("Secceed(memory->pipe)inputdatainmemory*caintopipen");returnn;/*返回写入字符个数

16、*/*读管道*/intnumread_simulate3705;/read_simulate3705diaoyongshuintread_simulate3705(intfd,char*ca,intn)/将管道fd内容读取n个字符到内存ca里(printf("(pipe->memory)outputdatafrompipeintomemory*can");numread_simulate3705+;longoffr,offw;/*读写指针,实际是读写字符个数*/intw;/*管道文件写端*/intm;/*若ca中的字符不能一次读完,m用来表示一次可读出的字符的最大数*

17、/intr=u_ofile3705fd;/*管道文件读端*/intpf=filer.f_inode;/*读管道对应的pipecb3705表的下标*/intrstart=0;/*计数器,读出字符个数*/inti=0;for(i;i<NFILE;i+)/*寻找读管道对应的读管道的端*/(if(filei.f_flag='w')&&(filei.f_inode=pf)(w=i;break;else(continue;printf("-addthelockn");pthread_mutex_lock(&lock);/*互斥锁,相当于进入

18、临界区*/offr=filer.f_offset;/*赋值读指针*/offw=filew.f_offset;/*赋值写指针*/if(offr=offw)/*管道空,无内容可读*/printf("pipeisempty,nothingtooutputn");if(pipecb3705pf.p_count=1)/*写端关闭*/pipecb3705pf.p_count-;/*文件的复制以完成,释放管道文件的空间*/printf("thewritepointisclosed,thecopyofthefileisfinishedn");return0;elsepr

19、intf("weakupthewritethread,makethepipewritablen");pthread_cond_signal(&wflag);/*唤醒写线程,管道可写*/printf("readthreadisblockedandunderthestatementofwaitingn");pthread_cond_wait(&rflag,&lock);/*读线程封锁等待*/offr=filer.f_offset;offw=filew.f_offset;m=n<=(offw-offr)?n:(offw-offr)

20、;/*得到可读字符个数*/for(rstart=0;rstart<m;rstart+)*ca=*(pipecb3705pf.p_addr+offr%PSIZE);ca+;offr+;filer.f_offset=offr;/*重定位读指针位置*/printf("weakthewritethread,makethepipewritablen");pthread_cond_signal(&wflag);printf("-releasethelockn");pthread_mutex_unlock(&lock);printf("

21、Secceed(pipe->memory)outputdatafromthepipeintomemory*can");returnm;/*线程调用,读源文件,写管道*/void*pwrite3705(void*a)/将源文件a内容写入管道中(printf("(file->pipe)inputdatafromtheoriginalfileintopipen");charabuf1BSIZE;structarg_set*args=(structarg_set*)a;/*需要传入多个参数时,用结构体传*/intfdr;intn_r;/*管道文件写入字符数*/

22、if(fdr=open(args->fname,O_RDONLY)!=-1)(while(n_r=read(fdr,abuf1,BSIZE)>0)/*读文件,写管道*/(printf("(file->memory)inputdatainoriginalfileintomemory*can");printf("Secceed(file->memory)inputdatainoriginalfileintomemory*can");/printf("(memory->pipe)inputdatainmemory*cai

23、ntopipen");write_simulate3705(args->f,abuf1,n_r);/printf("Secceed(memory->pipe)inputn");pipecb3705fileu_ofile3705args->f.f_inode.p_count-;/*文件已读完,关闭管道写端*/else(perror(args->fname);/*打开源文件可能不成功*/returnNULL;printf("Secceed(file->pipe)inputdatafromtheoriginalfileintopi

24、pen");returnNULL;/*线程调用,写目标文件,读管道*/void*pread3705(void*a)/读取管道,将其中内容写入新建文件中(printf("(pipe->file)outputdatafromthepipeintonewfilen");charabuf2BSIZE;/*缓冲区*/structarg_set*args=(structarg_set*)a;/*需要传入多个参数时,用结构体传*/intfdw;intn_w;/*管道文件读出字符数*/if(fdw=open(args->fname,O_CREAT|O_RDWR,077

25、7)!=-1)(while(n_w=read_simulate3705(args->f,abuf2,BSIZE)>0)/*读管道,写文件*/(/printf("(pipe->memory)outputdatafrompipeintomemory*can");/printf("Secceed(pipe->memory)outputdatafrompipeintomemory*can");printf("(memory->file)outputdatainmemory*caintofilen");write(

26、fdw,abuf2,n_w);printf("Secceed(memory->file)outputdatafromthepipeintonewfilen");)elseperror(args->fname);/*打开目标文件可能出错*/returnNULL;)printf("Secceed(pipe->file)outputdatafromthepipeintonewfilen");returnNULL;)/*主函数*/intmain(intargc,char*argv口)intx;u_ofile_init3705();while(x

27、=pipe_simulate3705(fd)=-1);/*创建管道,即申请空间*/if(x=-2)return-1;pthread_tt;/threadIDstructarg_setargs2;/*用结构体传写线程需要的参数:文件名,管道文件读写端*/args0.fname=argv1;/*源文件名*/args0.f=fd1;/*管道文件写端*/args1.fname=argv2;/*目标文件名*/args1.f=fd0;/*管道文件读端*/pthread_create(&t,NULL,pwrite3705,(void*)&args0);/*创建子线程,写管道*/pread37

28、05(void*)&args1);/*主线程调用,读管道*/pthread_join(t,NULL);/*等待写线程结束*/close_simulate3705(fd);printf("nnumofread_simulate3705=%dn",numread_simulate3705);printf("numofwrite_simulate3705=%dn",numwrite_simulate3705);return0;)ls-l总用量2379- rw-r-r-1johnjohn- rw-r-r-1johnjohn- rw-r-r-1johnjo

29、hn附录二(实验结果):502012-12-1718:063705368642012-07-1507:533705.doc954412012-08-2722:163705.JPG-rw-r-r-1johnjohn20839692010-11-0813:073705.mp3-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rw-r-r-1johnjohn848352012-07-1113:223705.pdf737282012-12-1716:483705.ppt199242012-07-0318:51370

30、5.rar02012-12-1722:49sta1115632012-12-1722:46tc_copy.cpp./tc3705a3705>copyl./tc3705a3705.doc./tc3705.doca3705.doc./tc3705.ppta3705.ppt./tc3705.mp3a3705.mp3./tc3705.rara3705.rar>copy2./tc3705.pdfa3705.rarIs-l总用量5163-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rw-r-r-1johnjohn502012-12-1718:06370536864201

31、2-07-1507:533705.doc954412012-08-2722:163705.JPG-rw-r-r-1johnjohn20839692010-11-0813:073705.mp3-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rw-r-r-1johnjohn-rwxr-xr-x1johnjohn-rwxr-xr-x1johnjohn-rwxr-xr-x1johnjohn848352012-07-1113:223705.pdf737282012-12-1716:483705.ppt199242012-07-0318:513705.rar502012-12-172

32、2:51a3705368642012-12-1722:51a3705.doc954412012-12-1722:53a3705.JPG-rwxr-xr-x1johnjohn20839692012-12-1722:54a3705.mp3-rwxr-xr-x1johnjohn-rwxr-xr-x1johnjohn-rwxr-xr-x1johnjohn- rw-r-r-1johnjohn- rw-r-r-1johnjohn- rw-r-r-1johnjohn- rw-r-r-1johnjohn848352012-12-1722:56a3705.pdf737282012-12-1722:53a3705.ppt199242012-12-1722:55a3705.rar13202012-12-1722:51cop12-1722:56copy26902012-12-1722:49sta102012-12-1722:57sta2-rwxr-xr-x1johnjohn-rw-r-r-1johnjohn122562012-12-1722:50tc115632012-12-1722:46tc_copy.cppcatcopylinitt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论