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

下载本文档

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

文档简介

1、共享知识分享快乐盛年不重来,一日难再晨。及时宜自勉,岁月不待人。操作系统:线程(进程)并发拷贝程序附录一:程序代码#in clude#in clude#in clude#in cludevfc ntl.h#in clude #in clude #in clude#define PSIZE 4096 /*管道文件的大小 */#define BSIZE 128/*默认缓冲区的大小*/#define NOFILE 20/*u_ofile3705表可分配的个数*/#define NFILE 20/*file表可分配的个数*/#defi ne NPIPE 20/*pipecb3705可分配的个数*/*进

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

3、=2表示读写都在被进行,=1表示在被读或被写,=0表示管道没被使用, 可分配*/pipecb3705NPIPE;/*模拟管道文件*/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;/* 写信号量 */ /* 线程创建

4、函数只能传一个参数,用结构体来封装所有参数*/struct arg_setchar *fname;/* 文件名 */int 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

5、create a pipen);int i;for(i=0;iNOFILE;i+)if(u_ofile3705i=-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

6、pipen); return -1; for(i=0;iNFILE;i+) if(filei.f_count!=1) 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; fo

7、r(i=0;i=NPIPE)printf(failure to create a pipen);return -1;printf(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

8、;/* 读写指针,实际是读写字符个数 */int r;/* 管道文件读端 */int m;/* 若 ca 中的字符不能一次写完, m 用来表示一次可写入的字符的最大数 */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)/* 对文件的复制操

9、作已进行结束,管道文件被释放 */ printf( 对文件的复制操作已进行结束,管道文件被释放 n);return 0;elsem = PSIZE+offr-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_

10、cond_signal(&rflag);/* 唤醒读线程,管道可读 */ printf(write thread is blocked and under 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;/* 返回写入字符个数 *

11、/* 读管道 */int numread_simulate3705;/read_simulate3705 diaoyongshuint read_simulate3705(int fd,char *ca,int n)/ 将管道 fd 内容读取 n 个字符到内存 ca 里 printf(pipememory)output data from pipe into memory *can);numread_simulate3705+;long offr,offw;/* 读写指针,实际是读写字符个数 */ int w;/* 管道文件写端 */int m;/* 若 ca 中的字符不能一次读完, m 用来

12、表示一次可读出的字符的最大数 */ int r = u_ofile3705fd;/* 管道文件读端 */int pf = filer.f_inode;/* 读管道对应的 pipecb3705 表的下标 */int rstart = 0;/* 计数器,读出字符个数 */int i = 0;for(i;iNFILE;i+)/* 寻找读管道对应的读管道的端 */ if(filei.f_flag=w)&(filei.f_inode=pf) w = i;break;elsecontinue;printf(add the lockn);pthread_mutex_lock(&lock);/* 互斥锁,相当

13、于进入临界区 */offr = filer.f_offset;/* 赋值读指针 */offw = filew.f_offset;/* 赋值写指针 */ if(offr=offw)/* 管道空,无内容可读 */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); ret

14、urn 0;elseprintf(weak up the write thread , make the pipe writablen); pthread_cond_signal(&wflag);/* 唤醒写线程,管道可写 */ 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-of

15、fr);/* 得到可读字符个数 */ for(rstart=0;rstartmemory)output data from the pipe into memory *can);return m;/* 线程调用,读源文件,写管道 */void *pwrite3705(void *a)/ 将源文件 a 内容写入管道中printf(filepipe)input data from the original file into pipen);char abuf1BSIZE;struct arg_set *args=(struct arg_set *)a;/* 需要传入多个参数时,用结构体传 */in

16、t fdr;int n_r;/* 管道文件写入字符数 */ if(fdr=open(args-fname,O_RDONL Y)!=-1)while(n_r=read(fdr,abuf1,BSIZE)0)/* 读文件,写管道 */printf(filememory)input data in original file into memory *can);printf(Secceed (filememory)input data in original file into memory *can);/printf(memorypipe)input data in memory *ca into

17、pipen);write_simulate3705(args-f,abuf1,n_r);/printf(Secceed (memorypipe)inputn); pipecb3705fileu_ofile3705args-f.f_inode.p_count-;/* 文件已读完,关闭管道写 端*/elseperror(args-fname);/* 打开源文件可能不成功 */return NULL;printf(Secceed (filepipe)input data from the original file into pipen);return NULL;/* 线程调用,写目标文件,读管道

18、*/void *pread3705(void *a)/ 读取管道,将其中内容写入新建文件中printf(pipefile)output data from the pipe into new 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(ar

19、gs-f,abuf2,BSIZE)0)/* 读管道,写文件 */printf(pipememory)output data from pipe into memory *can);/printf(Secceed (pipememory)output data from pipe into memory *can);printf(memoryfile)output data in memory *ca into filen);write(fdw,abuf2,n_w);printf(Secceed (memoryfile)output data from the pipe into new fil

20、en);else perror(args-fname);/* 打开目标文件可能出错 */ return NULL;printf(Secceed (pipefile)output 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 IDstruct ar

21、g_set args2;/* 用结构体传写线程需要的参数 : 文件名 ,管道文件读写端 */ args0.fname=argv1;/* 源文件名 */args0.f=fd1;/* 管道文件写端 */ args1.fname=argv2;/* 目标文件名 */args1.f=fd0;/* 管道文件读端 */ pthread_create(&t,NULL,pwrite3705,(void *)&args0);/* 创建子线程 ,写管道 */ pread3705(void *)&args1);/* 主线程调用 ,读管道 */ pthread_join(t,NULL);/* 等待写线程结束 */ cl

22、ose_simulate3705(fd);printf(nnum of read_simulate3705 = %dn,numread_simulate3705); printf(num of write_simulate3705 = %dn,numwrite_simulate3705); return 0;附录二(实验结果) :ls -l总用量 237950 2012-12-17 18:06 3705-rw-r-r- 1 john john卑微如蝼蚁、坚强似大象-rw-r-r- 1 john john36864 2012-07-15 07:53 3705.doc-rw-r-r- 1 john

23、 john95441 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 -rw-r-r- 1 john john -rw-r-r- 1 john john -rw-r-r- 1 john john -rw-r-r- 1 john john84835 2012-07-11 13:22 3705.pdf73728 2012-12-17 16:48 3705.ppt19924 2012-07-03 18:51 3705.rar0 2012-12-17

24、22:49 sta111563 2012-12-17 22:46 tc_copy.cpp./tc 3705 a3705 copy1./tc 3705 a3705.doc./tc 3705.doc a3705.doc./tc 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-rw-r-r- 1 john john-rw-r-r- 1 john john50 2012-12-17 18:06 37

25、05 36864 2012-07-15 07:53 3705.doc 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-rw-r-r- 1 john john84835 2012-07-11 13:22 3705.pdf73728 2012-12-17 16:48 3705.ppt-rw-r-r- 1 john john19924 2012-07-03 18:51 3705.rar-rwxr-xr-x 1 john john-rwxr

26、-xr-x 1 john john-rwxr-xr-x 1 john john50 2012-12-17 22:51 a3705 36864 2012-12-17 22:51 a3705.doc 95441 2012-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-rwxr-xr-x 1 john john-rwxr-xr-x 1 john john84835 2012-12-17 22:56 a3705.pdf73728 2012-12-1

27、7 22:53 a3705.ppt19924 2012-12-17 22:55 a3705.rar-rw-r-r- 1 john john -rw-r-r- 1 john john -rw-r-r- 1 john john -rw-r-r- 1 john john1320 2012-12-17 22:51 copy1 419294 2012-12-17 22:56 copy2 690 2012-12-17 22:49 sta1 0 2012-12-17 22:57 sta2-rwxr-xr-x 1 john john12256 2012-12-17 22:50 tc-rw-r-r- 1 joh

28、n john11563 2012-12-17 22:46 tc_copy.cppcat copy1 init the u_ofile start to create a pipeSecceed create the pipe(pipefile)output data from the pipe into new file(pipememory)output data from pipe into memory *caadd the lockpipe is empty , nothing to outputweak up the write thread , make the pipe writable read thread is bloc

温馨提示

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

评论

0/150

提交评论