操作系统实验报告_线程并发拷贝程序#特选内容_第1页
操作系统实验报告_线程并发拷贝程序#特选内容_第2页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统:线程(进程)并发拷贝程序附录一:程序代码#include#include#include#include#include#include#include#define PSIZE 4096 /*管道文件的大小*/#define BSIZE 128 /*默认缓冲区的大小*/#define NOFILE 20 /*u_ofile3705表可分配的个数*/#define NFILE 20 /*file表可分配的个数*/#define NPIPE 20 /*pipecb3705可分配的个数*/*进程的u_file表*/int u_ofile3705NOFILE;/*模拟file表*/stru

2、ct char f_flag;/*读写标志,w表示写,r表示读*/ int f_count;/*表示此表项的状态,=0表示此表项没被使用,可分配;=1表示此表项在被使用,不可再分配*/ int f_inode;/*对应的pipecb3705表下标*/ long f_offset;/*读写指针,当前已读或已写个数*/fileNFILE;/*管道控制块*/struct char *p_addr;/*管道文件基地址*/ int p_size;/*管道文件大小,PSIZE*/ int p_count;/*=2表示读写都在被进行,=1表示在被读或被写,=0表示管道没被使用,可分配*/pipecb3705

3、NPIPE;/*模拟管道文件*/char *pfile;/*管道的写入写出端*/int fd2;/*锁机制,实现互斥*/pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;/*进程间通信,实现同步*/pthread_cond_t rflag = PTHREAD_COND_INITIALIZER;/*读信号量*/pthread_cond_t wflag = PTHREAD_COND_INITIALIZER;/*写信号量*/*线程创建函数只能传一个参数,用结构体来封装所有参数*/struct arg_set char *fname; /*文件名*/ i

4、nt f; /*传递fdp*/;/*u_ofile3705表初始化*/int u_ofile_init3705() printf(init the u_ofile3705n); int i; for(i=0;iNOFILE;i+) u_ofile3705i = -1; u_ofile37050=0; u_ofile37051=0; u_ofile37052=0; return 0;/*创建管道*/int pipe_simulate3705(int a) printf(start to create a pipen); int i; for(i=0;iNOFILE;i+) if(u_ofile3

5、705i=-1) a0 = i;/*读*/ u_ofile3705i = 0;/*读端*/ break; for(i;i=NOFILE) printf(u_ofile3705分配失败,failure to create a pipen); return -2; pfile = (char *)malloc(PSIZE*sizeof(char);/*申请模拟管道用的内存空间*/ if(pfile=NULL)/*申请可能不成功*/ printf(failure to create a pipen); return -1; for(i=0;iNFILE;i+) if(filei.f_count!=1

6、) filei.f_flag = r;/*读标志*/ /filei.f_inode = 0;/*读对应pipecb3705表下标*/ filei.f_count = 1;/*file0这个表项在被使用,不可再分配*/ filei.f_offset = 0;/*读指针*/ u_ofile3705a0 = i;/*读端*/ break; for(i=0;i=NFILE) printf(failure to create a pipen); return -1; for(i=0;i=NPIPE) printf(failure to create a pipen); return -1; printf

7、(Secceed create the pipen); return 0;/*分配成功*/*关闭管道*/int close_simulate3705(int a) printf(start to close the pipe you have createdn); char *p; int i; for(i=0;ipipe)input data in memory *ca into pipen); numwrite_simulate3705+; long offr,offw;/*读写指针,实际是读写字符个数*/ int r;/*管道文件读端*/ int m;/*若ca中的字符不能一次写完,m用

8、来表示一次可写入的字符的最大数*/ int w = u_ofile3705fd;/*管道文件写端*/ int pf = filew.f_inode;/*读管道对应的pipecb3705表的下标*/ int n1 = n;/*一次应该写入的字符个数*/ int wstart = 0;/*计数器,写入字符个数*/ int i = 0; for(i;ioffr)/*不能一次写完*/ if(pipecb3705pf.p_count=0)/*对文件的复制操作已进行结束,管道文件被释放*/ printf(对文件的复制操作已进行结束,管道文件被释放n); return 0; else m = PSIZE+o

9、ffr-offw;/*最多可写入数*/ for(wstart=0;wstartm;wstart+) *(pipecb3705pf.p_addr+offw%PSIZE) = *ca; ca+; offw+; filew.f_offset = offw;/*重定位写指针位置*/ n1 = n1-m;/*剩余需要读的字符个数*/ printf(weak up the read thread , pipe is readablen); pthread_cond_signal(&rflag);/*唤醒读线程,管道可读*/ printf(write thread is blocked and under

10、the statement of waitingn); pthread_cond_wait(&wflag,&lock);/*写线程封锁等待*/ /*一次性可将ca中内容全部写入管道*/ offr = filer.f_offset; offw = filew.f_offset; for(wstart=0;wstartpipe)input data in memory *ca into pipen); return n;/*返回写入字符个数*/*读管道*/int numread_simulate3705;/read_simulate3705 diaoyongshuint read_simulate

11、3705(int fd,char *ca,int n)/将管道fd内容读取n个字符到内存ca里 printf(pipe-memory)output data from pipe into memory *can); numread_simulate3705+; long offr,offw;/*读写指针,实际是读写字符个数*/ int w;/*管道文件写端*/ int m;/*若ca中的字符不能一次读完,m用来表示一次可读出的字符的最大数*/ int r = u_ofile3705fd;/*管道文件读端*/ int pf = filer.f_inode;/*读管道对应的pipecb3705表的

12、下标*/ int rstart = 0;/*计数器,读出字符个数*/ int i = 0; for(i;iNFILE;i+)/*寻找读管道对应的读管道的端*/ if(filei.f_flag=w)&(filei.f_inode=pf) w = i; break; else continue; printf(-add the lockn); pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr = filer.f_offset;/*赋值读指针*/ offw = filew.f_offset;/*赋值写指针*/ if(offr=offw)/*管道空,无内容

13、可读*/ printf(pipe is empty , nothing to outputn); if(pipecb3705pf.p_count=1)/*写端关闭*/ pipecb3705pf.p_count-;/*文件的复制以完成,释放管道文件的空间*/ printf(the write point is closed,the copy of the file is finishedn); return 0; else printf(weak up the write thread , make the pipe writablen); pthread_cond_signal(&wflag)

14、;/*唤醒写线程,管道可写*/ printf(read thread is blocked and under the statement of waitingn); pthread_cond_wait(&rflag,&lock);/*读线程封锁等待*/ offr = filer.f_offset; offw = filew.f_offset; m = n=(offw-offr)?n:(offw-offr);/*得到可读字符个数*/ for(rstart=0;rstartmemory)output data from the pipe into memory *can); return m;/

15、*线程调用,读源文件,写管道*/void *pwrite3705(void *a)/将源文件a内容写入管道中 printf(file-pipe)input data from the original file into pipen); char abuf1BSIZE; struct arg_set *args=(struct arg_set *)a;/*需要传入多个参数时,用结构体传*/ int fdr; int n_r;/*管道文件写入字符数*/ if(fdr=open(args-fname,O_RDONLY)!=-1) while(n_r=read(fdr,abuf1,BSIZE)0)/

16、*读文件,写管道*/ printf(file-memory)input data in original file into memory *can); printf(Secceed (file-memory)input data in original file into memory *can); /printf(memory-pipe)input data in memory *ca into pipen); write_simulate3705(args-f,abuf1,n_r); /printf(Secceed (memory-pipe)inputn); pipecb3705file

17、u_ofile3705args-f.f_inode.p_count-;/*文件已读完,关闭管道写端*/ else perror(args-fname);/*打开源文件可能不成功*/ return NULL; printf(Secceed (file-pipe)input data from the original file into pipen); return NULL;/*线程调用,写目标文件,读管道*/void *pread3705(void *a)/读取管道,将其中内容写入新建文件中 printf(pipe-file)output data from the pipe into ne

18、w filen); char abuf2BSIZE;/*缓冲区*/ struct arg_set *args=(struct arg_set *)a;/*需要传入多个参数时,用结构体传*/ int fdw; int n_w;/*管道文件读出字符数*/ if(fdw=open(args-fname,O_CREAT|O_RDWR,0777)!=-1) while(n_w=read_simulate3705(args-f,abuf2,BSIZE)0)/*读管道,写文件*/ /printf(pipe-memory)output data from pipe into memory *can); /pr

19、intf(Secceed (pipe-memory)output data from pipe into memory *can); printf(memory-file)output data in memory *ca into filen); write(fdw,abuf2,n_w); printf(Secceed (memory-file)output data from the pipe into new filen); else perror(args-fname);/*打开目标文件可能出错*/ return NULL; printf(Secceed (pipe-file)outp

20、ut data from the pipe into new filen); return NULL;/*主函数*/int main(int argc,char *argv) int x; u_ofile_init3705(); while(x=pipe_simulate3705(fd)=-1);/*创建管道,即申请空间*/ if(x=-2) return -1; pthread_t t;/thread ID struct arg_set args2;/*用结构体传写线程需要的参数:文件名,管道文件读写端*/ args0.fname=argv1;/*源文件名*/ args0.f=fd1;/*管

21、道文件写端*/ args1.fname=argv2;/*目标文件名*/ args1.f=fd0;/*管道文件读端*/ pthread_create(&t,NULL,pwrite3705,(void *)&args0);/*创建子线程,写管道*/ pread3705(void *)&args1);/*主线程调用,读管道*/ pthread_join(t,NULL);/*等待写线程结束*/ close_simulate3705(fd); printf(nnum of read_simulate3705 = %dn,numread_simulate3705); printf(num of write

22、_simulate3705 = %dn,numwrite_simulate3705); return 0;附录二(实验结果):ls -l总用量 2379-rw-r-r- 1 john john 50 2012-12-17 18:06 3705-rw-r-r- 1 john john 36864 2012-07-15 07:53 3705.doc-rw-r-r- 1 john john 95441 2012-08-27 22:16 3705.JPG-rw-r-r- 1 john john 2083969 2010-11-08 13:07 3705.mp3-rw-r-r- 1 john john

23、84835 2012-07-11 13:22 3705.pdf-rw-r-r- 1 john john 73728 2012-12-17 16:48 3705.ppt-rw-r-r- 1 john john 19924 2012-07-03 18:51 3705.rar-rw-r-r- 1 john john 0 2012-12-17 22:49 sta1-rw-r-r- 1 john john 11563 2012-12-17 22:46 tc_copy.cpp./tc 3705 a3705 copy1./tc 3705 a3705.doc./tc 3705.doc a3705.doc./t

24、c 3705.ppt a3705.ppt./tc 3705.mp3 a3705.mp3./tc 3705.rar a3705.rar copy2./tc 3705.pdf a3705.rarls -l总用量 5163-rw-r-r- 1 john john 50 2012-12-17 18:06 3705-rw-r-r- 1 john john 36864 2012-07-15 07:53 3705.doc-rw-r-r- 1 john john 95441 2012-08-27 22:16 3705.JPG-rw-r-r- 1 john john 2083969 2010-11-08 13:

25、07 3705.mp3-rw-r-r- 1 john john 84835 2012-07-11 13:22 3705.pdf-rw-r-r- 1 john john 73728 2012-12-17 16:48 3705.ppt-rw-r-r- 1 john john 19924 2012-07-03 18:51 3705.rar-rwxr-xr-x 1 john john 50 2012-12-17 22:51 a3705-rwxr-xr-x 1 john john 36864 2012-12-17 22:51 a3705.doc-rwxr-xr-x 1 john john 95441 2

26、012-12-17 22:53 a3705.JPG-rwxr-xr-x 1 john john 2083969 2012-12-17 22:54 a3705.mp3-rwxr-xr-x 1 john john 84835 2012-12-17 22:56 a3705.pdf-rwxr-xr-x 1 john john 73728 2012-12-17 22:53 a3705.ppt-rwxr-xr-x 1 john john 19924 2012-12-17 22:55 a3705.rar-rw-r-r- 1 john john 1320 2012-12-17 22:51 copy1-rw-r

27、-r- 1 john john 419294 2012-12-17 22:56 copy2-rw-r-r- 1 john john 690 2012-12-17 22:49 sta1-rw-r-r- 1 john john 0 2012-12-17 22:57 sta2-rwxr-xr-x 1 john john 12256 2012-12-17 22:50 tc-rw-r-r- 1 john john 11563 2012-12-17 22:46 tc_copy.cppcat copy1init the u_ofilestart to create a pipeSecceed create the pipe(pipe-file)output data from the pipe into new file(pipe-memory)output data from pipe into memory *ca-add the lockpipe is empty , nothing to outputweak up the write thread , make the pipe writableread thread is blocked and under the statemen

温馨提示

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

评论

0/150

提交评论