版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统:线程(进程)并发拷贝程序#include#include#include#include#include #include#include TOC o 1-5 h z #define PSIZE 4096 /* 管道文件的大小*/#define BSIZE 128#define NOFILE 20#define NFILE 20#define NPIPE 20/* 默认缓冲区的大小*/*u_ofile3705 表可分配的个数*/*file 表可分配的个数*/*pipecb3705 可分配的个数*/ /* 进程的 u_file 表 */ int u_ofile3705NOFILE; /
2、*模拟 file 表 */ struct 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 表示在被读或被写,=
3、0 表示管道没被使用,可分配 */pipecb3705NPIPE; TOC o 1-5 h z /* 模拟管道文件*/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 create a pip
5、en);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 pipen);return -1;f
6、or(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;for(i=0;i=NPIPE)printf(failure t
7、o 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+; TOC o 1-5 h z 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)/* 对文件的复制操作已进行结束,管道文件被释放 printf( 对文
9、件的复制操作已进行结束,管道文件被释放n);return 0; else m = PSIZE+offr-offw;/* 最多可写入数*/for(wstart=0;wstartm;wstart+) *(pipecb3705pf.p_addr+offw%PSIZE) = *ca; ca+; offw+; filew.f_offset = offw;/* 重定位写指针位置*/ TOC o 1-5 h z n1 = n1-m;/* 剩余需要读的字符个数*/printf(weak up the read thread , pipe is readablen); pthread_cond_signal(&
10、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;/* 返回写入字符个数*/* 读管道 */ int numrea
11、d_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+; TOC o 1-5 h z 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; else continue;printf(add the lockn); TOC o 1-5 h z 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); return 0;e
14、lseprintf(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-offr);/* 得到可读
15、字符个数*/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; TOC o 1-5 h z struct arg_set *args=(struct arg_set *)a;/* 需要传入多个参数时,用结构体传*/int
16、 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 pipe
17、n);write_simulate3705(args-f,abuf1,n_r);/printf(Secceed (memorypipe)inputn);pipecb3705fileu_ofile3705args-f.f_inode.p_count-;/* 文件已读完,关闭管道写端 */else perror(args-fname);/* 打开源文件可能不成功*/return NULL;printf(Secceed (filepipe)input data from the original file into pipen);return NULL;/* 线程调用,写目标文件,读管道*/void
18、 *pread3705(void *a)/ 读取管道,将其中内容写入新建文件中printf(pipefile)output data from the pipe into new filen);char abuf2BSIZE;/* 缓冲区 */ TOC o 1-5 h z 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_simulate3
19、705(args-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 ne
20、w filen);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(); TOC o 1-5 h z while(x=pipe_simulate3705(fd)=-1);/* 创建管道,即申请空间*/if(x=-2)return -1;pthread_t t;/th
21、read IDstruct arg_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);/* 等待写线程结束*/close
22、_simulate3705(fd);printf(nnum of read_simulate3705 = %dn,numread_simulate3705);printf(num of write_simulate3705 = %dn,numwrite_simulate3705);return 0;ls -l总用量 2379rw-r-r- 1 john johnrw-r-r- 1 john johnrw-r-r- 1 john john50 2012-12-17 18:06 370536864 2012-07-15 07:53 3705.doc95441 2012-08-27 22:16 37
23、05.JPG -rw-r-r- 1 john john 2083969 2010-11-08 13:07 3705.mp3rw-r-r- 1 john johnrw-r-r- 1 john johnrw-r-r- 1 john johnrw-r-r- 1 john johnrw-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 22:49 sta111563 2012-12-17 22:46 tc_co
24、py.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 370536864 2012-07-15 07:53 3705.doc95441
25、 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-rwxr-xr-x 1 john john-rwxr-xr-x 1 john john-rwxr-xr-x 1 john john84835 2012-07-11 13:22 3705.pdf73728 2012-12-17 16:48 3705.ppt19924 2012-07-03 18:51 3705.rar5
26、0 2012-12-17 22:51 a370536864 2012-12-17 22:51 a3705.doc95441 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 johnrw-r-r- 1 john johnrw-r-r- 1 john johnrw-r-r- 1 john johnrw-r-r- 1 john john84835 2012-12
27、-17 22:56 a3705.pdf73728 2012-12-17 22:53 a3705.ppt19924 2012-12-17 22:55 a3705.rar1320 2012-12-17 22:51 copy1419294 2012-12-17 22:56 copy2690 2012-12-17 22:49 sta10 2012-12-17 22:57 sta2-rwxr-xr-x 1 john john-rw-r-r- 1 john john12256 2012-12-17 22:50 tc11563 2012-12-17 22:46 tc_copy.cppcat copy1init the u_ofilestart 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 writableread thread is blocked a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师培训成长汇报
- 《as引导定语从句》课件
- 儿童画京剧课件
- 动火作业安全管理培训
- 大班长城课件
- 葡萄沟公开课课件
- 《建筑装饰工程施工》课件
- 2024版钢筋加工企业人力资源服务合同2篇
- 二零二四年智能家居设备采购合同的技术规格与安装调试
- 2024年度工程咨询居间服务合同4篇
- 新编苏教版一年级科学上册实验报告册(典藏版)
- 广东省广州市2024年中考数学真题试卷(含答案)
- 2023年甘肃白银有色集团股份有限公司招聘考试真题
- 人教部编版七年级语文上册《阅读综合实践》示范课教学设计
- 企业信息化管理体系标准化建设方案
- 大学生心理健康教育(第二版) 课件 第十四章 大学生心理危机
- 2023-2024学年沪科版数学八年级上册期中测试题附答案(共2套)
- 高三一轮复习+化学反应速率及其影响因素+课件
- 五年级上册解方程练习100题及答案
- 北京市东城区2023-2024学年高三上学期期末统一测试英语试卷 含解析
- 2024年中科院心理咨询师官方备考试题库-上(单选题)
评论
0/150
提交评论