操作系統(tǒng)實(shí)驗(yàn)報(bào)告-線程并發(fā)拷貝程序_第1頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-線程并發(fā)拷貝程序_第2頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-線程并發(fā)拷貝程序_第3頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-線程并發(fā)拷貝程序_第4頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-線程并發(fā)拷貝程序_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、操作系統(tǒng):線程(進(jìn)程)并發(fā)拷貝程序#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/* 默認(rèn)緩沖區(qū)的大小*/*u_ofile3705 表可分配的個(gè)數(shù)*/*file 表可分配的個(gè)數(shù)*/*pipecb3705 可分配的個(gè)數(shù)*/ /* 進(jìn)程的 u_file 表 */ int u_ofile3705NOFILE; /

2、*模擬 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;/* 對(duì)應(yīng)的 pipecb3705 表下標(biāo) */long f_offset;/* 讀寫指針,當(dāng)前已讀或已寫個(gè)數(shù)*/fileNFILE;/* 管道控制塊*/struct char *p_addr;/* 管道文件基地址*/int p_size;/*管道文件大小,PSIZE*/int p_count;/*=2 表示讀寫都在被進(jìn)行,=1 表示在被讀或被寫,=

3、0 表示管道沒被使用,可分配 */pipecb3705NPIPE; TOC o 1-5 h z /* 模擬管道文件*/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_INITIALIZER;/* 讀信號(hào)量*/pthread_cond_t wflag = PTHREAD_COND_INITIALIZER;/* 寫信號(hào)量*/* 線程創(chuàng)建函數(shù)只能傳一個(gè)參數(shù),用

4、結(jié)構(gòu)體來封裝所有參數(shù)*/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;/* 創(chuàng)建管道*/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);/* 申請(qǐng)模擬管道用的內(nèi)存空間*/if(pfile=NULL)/* 申請(qǐng)可能不成功*/printf(failure to create a pipen);return -1;f

6、or(i=0;iNFILE;i+)if(filei.f_count!=1)filei.f_flag = r;/* 讀標(biāo)志 */filei.f_inode = 0;/* 讀對(duì)應(yīng) pipecb3705 表下標(biāo) */filei.f_count = 1;/*file0 這個(gè)表項(xiàng)在被使用,不可再分配*/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;/* 分配成功*/* 關(guān)閉管道*/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;/* 讀寫指針,實(shí)際是讀寫字符個(gè)

8、數(shù)*/int r;/* 管道文件讀端*/int m;/* 若 ca中的字符不能一次寫完,m 用來表示一次可寫入的字符的最大數(shù)*/int w = u_ofile3705fd;/* 管道文件寫端*/int pf = filew.f_inode;/* 讀管道對(duì)應(yīng)的pipecb3705 表的下標(biāo)*/int n1 = n;/* 一次應(yīng)該寫入的字符個(gè)數(shù)*/int wstart = 0;/* 計(jì)數(shù)器,寫入字符個(gè)數(shù)*/int i = 0;for(i;ioffr)/* 不能一次寫完*/*/ if(pipecb3705pf.p_count=0)/* 對(duì)文件的復(fù)制操作已進(jìn)行結(jié)束,管道文件被釋放 printf( 對(duì)文

9、件的復(fù)制操作已進(jìn)行結(jié)束,管道文件被釋放n);return 0; else m = PSIZE+offr-offw;/* 最多可寫入數(shù)*/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;/* 剩余需要讀的字符個(gè)數(shù)*/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中內(nèi)容全部寫入管道*/offr = filer.f_offset;offw = filew.f_offset;for(wstart=0;wstartpipe)input data in memory *ca into pipen);return n;/* 返回寫入字符個(gè)數(shù)*/* 讀管道 */ int numrea

11、d_simulate3705;/read_simulate3705 diaoyongshuint read_simulate3705(int fd,char *ca,int n)/ 將管道 fd 內(nèi)容讀取n 個(gè)字符到內(nèi)存ca 里printf(pipememory)output data from pipe into memory *can);numread_simulate3705+; TOC o 1-5 h z long offr,offw;/* 讀寫指針,實(shí)際是讀寫字符個(gè)數(shù)*/int w;/* 管道文件寫端*/int m;/* 若 ca中的字符不能一次讀完,m 用來表示一次可讀出的字符的最

12、大數(shù)*/int r = u_ofile3705fd;/* 管道文件讀端*/int pf = filer.f_inode;/* 讀管道對(duì)應(yīng)的pipecb3705 表的下標(biāo)*/int rstart = 0;/* 計(jì)數(shù)器,讀出字符個(gè)數(shù)*/int i = 0;for(i;iNFILE;i+)/* 尋找讀管道對(duì)應(yīng)的讀管道的端*/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);/* 互斥鎖,相當(dāng)于進(jìn)入臨

13、界區(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ù)制以完成,釋放管道文件的空間*/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、字符個(gè)數(shù)*/for(rstart=0;rstartmemory)output data from the pipe into memory *can);return m;/* 線程調(diào)用,讀源文件,寫管道*/void *pwrite3705(void *a)/ 將源文件a 內(nèi)容寫入管道中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;/* 需要傳入多個(gè)參數(shù)時(shí),用結(jié)構(gòu)體傳*/int

16、 fdr;int n_r;/* 管道文件寫入字符數(shù)*/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-;/* 文件已讀完,關(guān)閉管道寫端 */else perror(args-fname);/* 打開源文件可能不成功*/return NULL;printf(Secceed (filepipe)input data from the original file into pipen);return NULL;/* 線程調(diào)用,寫目標(biāo)文件,讀管道*/void

18、 *pread3705(void *a)/ 讀取管道,將其中內(nèi)容寫入新建文件中printf(pipefile)output data from the pipe into new filen);char abuf2BSIZE;/* 緩沖區(qū) */ TOC o 1-5 h z struct arg_set *args=(struct arg_set *)a;/* 需要傳入多個(gè)參數(shù)時(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_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);/* 打開目標(biāo)文件可能出錯(cuò)*/return NULL; printf(Secceed (pipefile)output data from the pipe into new filen);return NULL;/* 主函數(shù) */int main(int argc,char *argv)int x;u_ofile_init3705(); TOC o 1-5 h z while(x=pipe_simulate3705(fd)=-1);/* 創(chuàng)建管道,即申請(qǐng)空間*/if(x=-2)return -1;pthread_t t;/th

21、read IDstruct 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);/* 創(chuàng)建子線程,寫管道 */pread3705(void *)&args1);/* 主線程調(diào)用,讀管道*/pthread_join(t,NULL);/* 等待寫線程結(jié)束*/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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論