文件的讀寫與上鎖_第1頁
文件的讀寫與上鎖_第2頁
文件的讀寫與上鎖_第3頁
文件的讀寫與上鎖_第4頁
文件的讀寫與上鎖_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1. 實驗?zāi)康耐ㄟ^編寫文件讀寫及上鎖的程序,進(jìn)一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。2. 實驗內(nèi)容在Linux中FIFO(先進(jìn)先出)是一種進(jìn)程間的管道通信機(jī)制。本實驗通過使用文件操作,仿真FIFO結(jié)構(gòu)以及生產(chǎn)者-消費(fèi)者運(yùn)行模型。3. 實驗步驟(1)流程圖該實驗流程圖如圖所示 (2)程序說明本實驗需要打開兩個虛擬終端,分別運(yùn)行生產(chǎn)者程序(producer)和消費(fèi)者程序(customer)。此時兩個進(jìn)程同時對同一個文件進(jìn)行讀寫操作。因為這個文件是臨界資源,所以可以使用文件鎖機(jī)制保證兩個進(jìn)程對文件的訪問都是原

2、子操作。先啟動生產(chǎn)者進(jìn)程,它負(fù)責(zé)創(chuàng)建仿真FIFO結(jié)構(gòu)文件(實際是一個普通文件)并投入生產(chǎn),就是按照給定的時間間隔,向FIFO文件寫入自動生成的字符(在程序中用宏定義選擇使用數(shù)字還是使用英文字符),生產(chǎn)周期以及要生產(chǎn)的資源數(shù)通過參數(shù)傳遞給進(jìn)程(默認(rèn)生產(chǎn)周期1S,要生產(chǎn)的資源數(shù)為10個字符)。后啟動的消費(fèi)者進(jìn)程按照給定的數(shù)目進(jìn)行消費(fèi),首先從文件中讀取相應(yīng)數(shù)目的字符并在屏幕顯示,然后從文件中刪除剛才消費(fèi)過的數(shù)據(jù)。為了仿真FIFO結(jié)構(gòu),此時需要使用兩次復(fù)制來實現(xiàn)文件內(nèi)容的偏移。每次消費(fèi)的資源數(shù)通過參數(shù)傳遞給進(jìn)程,默認(rèn)值為10個字符。(3)代碼/* lock_set.c */int lock_set(i

3、nt fd, int type)struct flock old_lock, lock;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0;lock.l_type = type;lock.l_pid = -1;/* 判斷文件是否可以上鎖 */fcntl(fd, F_GETLK, &lock);if (lock.l_type != F_UNLCK)/* 判斷文件不能上鎖的原因 */if (lock.l_type = F_RDLCK) /* 該文件已有讀取鎖 */printf(Read lock already set by %dn,

4、lock.l_pid);else if (lock.l_type = F_WRLCK) /* 該文件已有寫入鎖 */printf(Write lock already set by %dn, lock.l_pid);/* l_type 可能已被F_GETLK修改過 */lock.l_type = type;/* 根據(jù)不同的type值進(jìn)行阻塞式上鎖或解鎖 */if (fcntl(fd, F_SETLKW, &lock) 0)printf(Lock failed:type = %dn, lock.l_type);return 1;switch(lock.l_type)case F_RDLCK:pr

5、intf(Read lock set by %dn, getpid();break;case F_WRLCK:printf(Write lock set by %dn, getpid();break;case F_UNLCK:printf(Release lock by %dn, getpid();return 1;break;default:break;/* end of switch */return 0;本實驗中的生產(chǎn)者程序的源代碼如下所示,其中用到的lock_set()函數(shù)。/* producer.c */#include #include #include #include #inc

6、lude #include mylock.h#define MAXLEN 10 /* 緩沖區(qū)大小最大值*/#define ALPHABET 1 /* 表示使用英文字符 */#define ALPHABET_START a /* 頭一個字符,可以用 A*/#define COUNT_OF_ALPHABET 26 /* 字母字符的個數(shù) */#define DIGIT 2 /* 表示使用數(shù)字字符 */#define DIGIT_START 0 /* 頭一個字符 */#define COUNT_OF_DIGIT 10 /* 數(shù)字字符的個數(shù) */#define SIGN_TYPE ALPHABET /*

7、 本實例選用英文字符 */const char *fifo_file = ./myfifo; /* 仿真FIFO文件名 */char buffMAXLEN; /* 緩沖區(qū) */* 功能:生產(chǎn)一個字符并寫入到仿真FIFO文件中 */int product(void)int fd;unsigned int sign_type, sign_start, sign_count, size;static unsigned int counter = 0;/* 打開仿真FIFO文件 */if (fd = open(fifo_file, O_CREAT|O_RDWR|O_APPEND, 0644) 0)pr

8、intf(Open fifo file errorn);exit(1);sign_type = SIGN_TYPE;switch(sign_type)case ALPHABET:/* 英文字符 */sign_start = ALPHABET_START;sign_count = COUNT_OF_ALPHABET;break;case DIGIT:/* 數(shù)字字符 */sign_start = DIGIT_START;sign_count = COUNT_OF_DIGIT;break;default:return -1;/*end of switch*/sprintf(buff, %c, (si

9、gn_start + counter);counter = (counter + 1) % sign_count;lock_set(fd, F_WRLCK); /* 上寫鎖*/if (size = write(fd, buff, strlen(buff) 1)sscanf(argv1, %d, &time_step);if (argc 2)sscanf(argv2, %d, &time_life);while (time_life-)if (product() 0)break;sleep(time_step);exit(EXIT_SUCCESS);本實驗中的消費(fèi)者程序的源代碼如下所示。/* c

10、ustomer.c */#include #include #include #include #define MAX_FILE_SIZE 100 * 1024 * 1024 /* 100M*/const char *fifo_file = ./myfifo; /* 仿真FIFO文件名 */const char *tmp_file = ./tmp; /* 臨時文件名 */* 資源消費(fèi)函數(shù) */int customing(const char *myfifo, int need)int fd;char buff;int counter = 0;if (fd = open(myfifo, O_RD

11、ONLY) 0)printf(Function customing errorn);return -1;printf(Enjoy:);lseek(fd, SEEK_SET, 0);while (counter need)while (read(fd, &buff, 1) = 1) & (counter need)fputc(buff, stdout); /* 消費(fèi)就是在屏幕上簡單的顯示 */counter+;fputs(n, stdout);close(fd);return 0;/* 功能:從sour_file文件的offset偏移處開始將count字節(jié)大小的數(shù)據(jù)拷貝到dest_file文件

12、*/int myfilecopy(const char *sour_file, const char *dest_file, int offset,int count, int copy_mode)int in_file, out_file;int counter = 0;char buff_unit;if (in_file = open(sour_file,O_RDONLY|O_NONBLOCK)0)printf(Function myfilecopy error in source filen);return -1;if(out_file=open(dest_file,O_CREAT|O_

13、RDWR|O_TRUNC|O_NONBLOCK, 0644) 0)printf(Function myfilecopy errorindestination file:);return -1;lseek(in_file, offset, SEEK_SET);while(read(in_file,&buff_unit,1)=1)&(countercount)write(out_file, &buff_unit, 1);counter+;close(in_file);close(out_file);return 0;/* 功能:實現(xiàn)FIFO消費(fèi)者 */int custom(int need)int fd;/* 對資源進(jìn)行消費(fèi),need表示該消費(fèi)的資源數(shù)目 */customing(fifo_file, need);if (fd = open(fifo_file, O_RDWR) 1) /* 第一個參數(shù)指定需要消費(fèi)的資源數(shù)目,默認(rèn)值為10 */sscanf(argv1, %d, &customer_capacity);if (customer_capacity 0)custom(customer_capacity);exit(EXIT_SUCCESS);4、

溫馨提示

  • 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

提交評論