版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國姬松茸行業(yè)運(yùn)行態(tài)勢分析及發(fā)展策略研究報告
- 2024-2030年中國城市綜合體市場運(yùn)作模式調(diào)研規(guī)劃研究報告
- 2024-2030年中國城市供水行業(yè)運(yùn)行現(xiàn)狀及發(fā)展規(guī)劃研究報告版
- 2024-2030年中國地高辛片資金申請報告
- 2024-2030年中國半球網(wǎng)絡(luò)攝像機(jī)市場運(yùn)行狀況及投資前景趨勢分析報告
- 2024年度新能源汽車充電樁授權(quán)經(jīng)銷合同3篇
- 2024年特定圖書區(qū)域銷售代理合同一
- 2024年版離婚合同子女撫養(yǎng)權(quán)益范本版
- 2024全新房屋出售協(xié)議公證及綠化養(yǎng)護(hù)合同下載3篇
- 2025年銅仁運(yùn)輸從業(yè)資格證考試技巧
- 人教版(2024年新教材)七年級上冊英語各單元語法知識點復(fù)習(xí)提綱
- 陜煤集團(tuán)筆試題庫及答案
- 33 《魚我所欲也》對比閱讀-2024-2025中考語文文言文閱讀專項訓(xùn)練(含答案)
- 2022年國防軍工計量檢定人員考試附有答案
- 《中華民族共同體概論》考試復(fù)習(xí)題庫(含答案)
- 復(fù)變函數(shù)論與運(yùn)算微積智慧樹知到課后章節(jié)答案2023年下哈爾濱工業(yè)大學(xué)(威海)
- MJS工法施工技術(shù)及控制要點
- 養(yǎng)殖戶糞污污染情況整改報告2篇
- 2022年營配貫通項目背景,相關(guān)系統(tǒng)及工作內(nèi)容介紹
- 工程公司薪酬體系方案
- 傳染病漏報檢查、責(zé)任追究制度
評論
0/150
提交評論