操作系統(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頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論