版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng):線程(進(jìn)程)并發(fā)拷貝程序附錄一:程序代碼#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<pthread.h>#include<malloc.h>#define PSIZE 4096 /*管道文件的大小*/#define BSIZE 128 /*默認(rèn)緩沖區(qū)的大小*/#define NOFILE 20 /*u_ofile3705表可分配的個數(shù)*/#de
2、fine NFILE 20 /*file表可分配的個數(shù)*/#define NPIPE 20 /*pipecb3705可分配的個數(shù)*/*進(jìn)程的u_file表*/int u_ofile3705NOFILE;/*模擬file表*/struct char f_flag;/*讀寫標(biāo)志,'w'表示寫,'r'表示讀*/ int f_count;/*表示此表項(xiàng)的狀態(tài),=0表示此表項(xiàng)沒被使用,可分配;=1表示此表項(xiàng)在被使用,不可再分配*/ int f_inode;/*對應(yīng)的pipecb3705表下標(biāo)*/ long f_offset;/*讀寫指針,當(dāng)前已讀或已寫個數(shù)*/fileNF
3、ILE;/*管道控制塊*/struct char *p_addr;/*管道文件基地址*/ int p_size;/*管道文件大小,PSIZE*/ int p_count;/*=2表示讀寫都在被進(jìn)行,=1表示在被讀或被寫,=0表示管道沒被使用,可分配*/pipecb3705NPIPE;/*模擬管道文件*/char *pfile;/*管道的寫入寫出端*/int fd2;/*鎖機(jī)制,實(shí)現(xiàn)互斥*/pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;/*進(jìn)程間通信,實(shí)現(xiàn)同步*/pthread_cond_t rflag = PTHREAD_COND_INITI
4、ALIZER;/*讀信號量*/pthread_cond_t wflag = PTHREAD_COND_INITIALIZER;/*寫信號量*/*線程創(chuàng)建函數(shù)只能傳一個參數(shù),用結(jié)構(gòu)體來封裝所有參數(shù)*/struct arg_set char *fname; /*文件名*/ int f; /*傳遞fdp*/;/*u_ofile3705表初始化*/int u_ofile_init3705() printf("init the u_ofile3705n"); int i; for(i=0;i<NOFILE;i+) u_ofile3705i = -1; u_ofile37050=
5、0; u_ofile37051=0; u_ofile37052=0; return 0;/*創(chuàng)建管道*/int pipe_simulate3705(int a) printf("start to create a pipen"); int i; 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;/*寫端*/
6、break; if(i>=NOFILE) printf("u_ofile3705分配失敗,failure to create a pipen"); return -2; pfile = (char *)malloc(PSIZE*sizeof(char);/*申請模擬管道用的內(nèi)存空間*/ if(pfile=NULL)/*申請可能不成功*/ printf("failure to create a pipen"); return -1; for(i=0;i<NFILE;i+) if(filei.f_count!=1) filei.f_flag =
7、'r'/*讀標(biāo)志*/ /filei.f_inode = 0;/*讀對應(yīng)pipecb3705表下標(biāo)*/ filei.f_count = 1;/*file0這個表項(xiàng)在被使用,不可再分配*/ filei.f_offset = 0;/*讀指針*/ u_ofile3705a0 = i;/*讀端*/ break; for(i=0;i<NFILE;i+) if(filei.f_count!=1) filei.f_flag = 'w'/*寫標(biāo)志*/ /filei.f_inode = 0;/*寫對應(yīng)pipecb3705控制塊下標(biāo)*/ filei.f_count = 1;/*
8、file1這個表項(xiàng)在被使用,不可再分配*/ filei.f_offset = 0;/*寫指針*/ u_ofile3705a1 = i;/*寫端*/ break; if(i>=NFILE) printf("failure to create a pipen"); return -1; for(i=0;i<NPIPE;i+) if(pipecb3705i.p_count=0) pipecb3705i.p_addr = pfile;/*給管道文件基地址賦值*/ pipecb3705i.p_size = PSIZE;/*管道文件大小*/ pipecb3705i.p_co
9、unt = 2;/*讀寫都在進(jìn)行,此pipecb3705表項(xiàng)不可再分*/ fileu_ofile3705a0.f_inode = i; fileu_ofile3705a1.f_inode = i; break; if(i>=NPIPE) printf("failure to create a pipen"); return -1; printf("Secceed create the pipen"); return 0;/*分配成功*/*關(guān)閉管道*/int close_simulate3705(int a) printf("start t
10、o close the pipe you have createdn"); char *p; int i; for(i=0;i<2;i+) p=pipecb3705fileu_ofile3705ai.f_inode.p_addr; /* if(p!=NULL) free(p); /釋放管道內(nèi)存 */ pipecb3705fileu_ofile3705ai.f_inode.p_count = 0; /*管道控制塊計(jì)數(shù)清零*/ fileu_ofile3705ai.f_count = 0; /*file表項(xiàng)計(jì)數(shù)清零*/ u_ofile3705ai = -1; /*u_ofile370
11、5表項(xiàng)清空*/ ai = -1; /*fdp清空?*/ printf("secceed close the pipen"); return 0;/*寫管道*/int numwrite_simulate3705;int write_simulate3705(int fd,char *ca,int n)/將內(nèi)存ca內(nèi)容寫入n個字符到管道fd里 printf("(memory->pipe)input data in memory *ca into pipen"); numwrite_simulate3705+; long offr,offw;/*讀寫指針
12、,實(shí)際是讀寫字符個數(shù)*/ int r;/*管道文件讀端*/ int m;/*若ca中的字符不能一次寫完,m用來表示一次可寫入的字符的最大數(shù)*/ int w = u_ofile3705fd;/*管道文件寫端*/ int pf = filew.f_inode;/*讀管道對應(yīng)的pipecb3705表的下標(biāo)*/ int n1 = n;/*一次應(yīng)該寫入的字符個數(shù)*/ int wstart = 0;/*計(jì)數(shù)器,寫入字符個數(shù)*/ int i = 0; for(i;i<NFILE;i+)/*尋找寫管道對應(yīng)的讀管道的讀端*/ if(filei.f_flag='r')&&(f
13、ilei.f_inode=pf) r = i; break; else continue; printf("-add the lockn"); pthread_mutex_lock(&lock);/*互斥鎖,相當(dāng)于進(jìn)入臨界區(qū)*/ offr = filer.f_offset;/*賦值讀指針*/ offw = filew.f_offset;/*賦值寫指針*/ if(offw+n1-PSIZE)>offr)/*不能一次寫完*/ if(pipecb3705pf.p_count=0)/*對文件的復(fù)制操作已進(jìn)行結(jié)束,管道文件被釋放*/ printf("對文件的復(fù)
14、制操作已進(jìn)行結(jié)束,管道文件被釋放n"); return 0; else m = PSIZE+offr-offw;/*最多可寫入數(shù)*/ for(wstart=0;wstart<m;wstart+) *(pipecb3705pf.p_addr+offw%PSIZE) = *ca; ca+; offw+; filew.f_offset = offw;/*重定位寫指針位置*/ n1 = n1-m;/*剩余需要讀的字符個數(shù)*/ printf("weak up the read thread , pipe is readablen"); pthread_cond_sig
15、nal(&rflag);/*喚醒讀線程,管道可讀*/ printf("write thread is blocked and under the statement of waitingn"); pthread_cond_wait(&wflag,&lock);/*寫線程封鎖等待*/ /*一次性可將ca中內(nèi)容全部寫入管道*/ offr = filer.f_offset; offw = filew.f_offset; for(wstart=0;wstart<n1;wstart+) /*printf("%dn",pipecb370
16、5pf.p_addr);*/ *(pipecb3705pf.p_addr+offw%PSIZE) = *ca; /*printf("%dn",wstart);*/ ca+; offw+; filew.f_offset = offw; pthread_cond_signal(&rflag); printf("-release the lockn"); pthread_mutex_unlock(&lock); printf("Secceed (memory->pipe)input data in memory *ca into
17、 pipen"); return n;/*返回寫入字符個數(shù)*/*讀管道*/int numread_simulate3705;/read_simulate3705 diaoyongshuint read_simulate3705(int fd,char *ca,int n)/將管道fd內(nèi)容讀取n個字符到內(nèi)存ca里 printf("(pipe->memory)output data from pipe into memory *can"); numread_simulate3705+; long offr,offw;/*讀寫指針,實(shí)際是讀寫字符個數(shù)*/ int
18、w;/*管道文件寫端*/ int m;/*若ca中的字符不能一次讀完,m用來表示一次可讀出的字符的最大數(shù)*/ int r = u_ofile3705fd;/*管道文件讀端*/ int pf = filer.f_inode;/*讀管道對應(yīng)的pipecb3705表的下標(biāo)*/ int rstart = 0;/*計(jì)數(shù)器,讀出字符個數(shù)*/ int i = 0; for(i;i<NFILE;i+)/*尋找讀管道對應(yīng)的讀管道的端*/ if(filei.f_flag='w')&&(filei.f_inode=pf) w = i; break; else continue;
19、 printf("-add the lockn"); pthread_mutex_lock(&lock);/*互斥鎖,相當(dāng)于進(jìn)入臨界區(qū)*/ offr = filer.f_offset;/*賦值讀指針*/ offw = filew.f_offset;/*賦值寫指針*/ if(offr=offw)/*管道空,無內(nèi)容可讀*/ printf("pipe is empty , nothing to outputn"); if(pipecb3705pf.p_count=1)/*寫端關(guān)閉*/ pipecb3705pf.p_count-;/*文件的復(fù)制以完成,釋
20、放管道文件的空間*/ 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);/*喚醒寫線程,管道可寫*/ printf("read thread is blocked and under the statement of waitingn&qu
21、ot;); pthread_cond_wait(&rflag,&lock);/*讀線程封鎖等待*/ offr = filer.f_offset; offw = filew.f_offset; m = n<=(offw-offr)?n:(offw-offr);/*得到可讀字符個數(shù)*/ for(rstart=0;rstart<m;rstart+) *ca = *(pipecb3705pf.p_addr+offr%PSIZE); ca+; offr+; filer.f_offset = offr;/*重定位讀指針位置*/ printf("weak the wri
22、te thread , make the pipe writablen"); pthread_cond_signal(&wflag); printf("-release the lockn"); pthread_mutex_unlock(&lock); printf("Secceed (pipe->memory)output data from the pipe into memory *can"); return m;/*線程調(diào)用,讀源文件,寫管道*/void *pwrite3705(void *a)/將源文件a內(nèi)容寫入
23、管道中 printf("(file->pipe)input data from the original file into pipen"); char abuf1BSIZE; struct arg_set *args=(struct arg_set *)a;/*需要傳入多個參數(shù)時,用結(jié)構(gòu)體傳*/ int fdr; int n_r;/*管道文件寫入字符數(shù)*/ if(fdr=open(args->fname,O_RDONLY)!=-1) while(n_r=read(fdr,abuf1,BSIZE)>0)/*讀文件,寫管道*/ printf("(f
24、ile->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 (m
25、emory->pipe)inputn"); pipecb3705fileu_ofile3705args->f.f_inode.p_count-;/*文件已讀完,關(guān)閉管道寫端*/ else perror(args->fname);/*打開源文件可能不成功*/ return NULL; printf("Secceed (file->pipe)input data from the original file into pipen"); return NULL;/*線程調(diào)用,寫目標(biāo)文件,讀管道*/void *pread3705(void *a)/
26、讀取管道,將其中內(nèi)容寫入新建文件中 printf("(pipe->file)output data from the pipe into new filen"); char abuf2BSIZE;/*緩沖區(qū)*/ struct arg_set *args=(struct arg_set *)a;/*需要傳入多個參數(shù)時,用結(jié)構(gòu)體傳*/ int fdw; int n_w;/*管道文件讀出字符數(shù)*/ if(fdw=open(args->fname,O_CREAT|O_RDWR,0777)!=-1) while(n_w=read_simulate3705(args->
27、;f,abuf2,BSIZE)>0)/*讀管道,寫文件*/ /printf("(pipe->memory)output data from pipe into memory *can"); /printf("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
28、("Secceed (memory->file)output data from the pipe into new filen"); else perror(args->fname);/*打開目標(biāo)文件可能出錯*/ return NULL; printf("Secceed (pipe->file)output data from the pipe into new filen"); return NULL;/*主函數(shù)*/int main(int argc,char *argv) int x; u_ofile_init3705(); wh
29、ile(x=pipe_simulate3705(fd)=-1);/*創(chuàng)建管道,即申請空間*/ if(x=-2) return -1; pthread_t t;/thread ID struct arg_set args2;/*用結(jié)構(gòu)體傳寫線程需要的參數(shù):文件名,管道文件讀寫端*/ args0.fname=argv1;/*源文件名*/ args0.f=fd1;/*管道文件寫端*/ args1.fname=argv2;/*目標(biāo)文件名*/ args1.f=fd0;/*管道文件讀端*/ pthread_create(&t,NULL,pwrite3705,(void *)&args0);
30、/*創(chuàng)建子線程,寫管道*/ pread3705(void *)&args1);/*主線程調(diào)用,讀管道*/ pthread_join(t,NULL);/*等待寫線程結(jié)束*/ close_simulate3705(fd); printf("nnum of read_simulate3705 = %dn",numread_simulate3705); printf("num of write_simulate3705 = %dn",numwrite_simulate3705); return 0;附錄二(實(shí)驗(yàn)結(jié)果):ls -l總用量 2379-rw-r
31、-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 84835 2012-07-11 13:22 3705.pdf-rw-r-r- 1 john john 73728 2012-12-17 16:48 3705.p
32、pt-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./tc 3705.ppt a3705.ppt./tc 3705.mp3 a3705.mp3./tc 3705.rar a3705.rar > copy
33、2./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:07 3705.mp3-rw-r-r- 1 john john 84835 2012-07-11 13:22 3705.pdf-rw-r-r-
34、 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 2012-12-17 22:53 a3705.JPG-rwxr-xr-x 1 john john 2083969 2012-12-17 22:5
35、4 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-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)out
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度文化產(chǎn)業(yè)發(fā)展總經(jīng)理聘用協(xié)議3篇
- 《蒸汽鍋爐維護(hù)與管理》課件
- 2025年度個人二手房交易反擔(dān)保合同規(guī)范4篇
- 2025年度博物館展覽館日常保潔與文物保護(hù)合同4篇
- 2025年新能源汽車租賃合同車輛租賃市場分析報(bào)告2篇
- 2025年度西瓜品牌授權(quán)與銷售合作協(xié)議3篇
- 2025年度個人汽車租賃合同違約責(zé)任范本3篇
- 2025年陜西融發(fā)建設(shè)集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年福建福旅旅游股份有限公司招聘筆試參考題庫含答案解析
- 二零二五年度門禁系統(tǒng)遠(yuǎn)程監(jiān)控服務(wù)協(xié)議4篇
- GB/T 31888-2015中小學(xué)生校服
- 質(zhì)量檢查考核辦法
- 不動產(chǎn)登記實(shí)務(wù)培訓(xùn)教程課件
- 不銹鋼制作合同范本(3篇)
- 云南省普通初中學(xué)生成長記錄-基本素質(zhì)發(fā)展初一-初三
- 2023年系統(tǒng)性硬化病診斷及診療指南
- 外科醫(yī)師手術(shù)技能評分標(biāo)準(zhǔn)
- 《英語教師職業(yè)技能訓(xùn)練簡明教程》全冊配套優(yōu)質(zhì)教學(xué)課件
- 采購控制程序
- 六年級上冊數(shù)學(xué)簡便計(jì)算題200題專項(xiàng)練習(xí)
- 冀教版八年級上冊Unit 1 單詞短語句型復(fù)習(xí)預(yù)習(xí)單
評論
0/150
提交評論