檔案的讀寫和上鎖

2021-05-23 00:19:27 字數 2244 閱讀 3807

通過使用檔案操作,**生產者-消費者執行模型。

本實驗中需要開啟兩個虛擬終端,分別執行生產者程式(producer)和消費者程式(customer)。

此時兩個程序同時對同乙個檔案進行讀寫操作。因為這個檔案是臨界資源,所以可以使用檔案鎖機制來保證兩個程序對檔案的訪問都是原子操作。

檔案裡面就只用乙個數字來表示當前的貨物數量。檔案中的數字最開始初始化為0。且最多容納9個物品。

//生產者

#include   

#include   

#include   

#include   

#include   

#include   

#define     n 9

int main(int argc, char *argv)

//把檔案描述符轉換成對應的檔案指標

fp=fdopen(fd, "r+");

//一定要把檔案讀寫設定為無緩衝,否則有大問題

//至於是什麼問題可以把底下這個if語句注釋掉看看執行結果

if( setvbuf(fp, null, _ionbf, 0)!=0)

struct flock lock;

lock.l_type=f_wrlck;

lock.l_start=0;

lock.l_whence=seek_set;

lock.l_len=0;

struct flock unlock;

unlock.l_type=f_unlck;

unlock.l_start=0;

unlock.l_whence=seek_set;

unlock.l_len=0;

while(1)

printf("fifo檔案加鎖成功!/n");

//這裡就不進行出錯檢測了

rewind(fp);

fscanf(fp, "%d", &num);

printf("從檔案中讀出的num為%d/n", num);

num++;

if (num>n)

printf("fifo檔案解鎖成功!/n");

sleep(1);

} else

printf("fifo檔案解鎖成功!/n");

//每隔1秒生產乙個物品

sleep(1);

} }    }

//消費者

#include   

#include   

#include   

#include   

#include   

#include   

#include   

int main(int argc, char *argv)

fp=fdopen(fd, "r+");

//一定要把檔案讀寫設定為無緩衝,否則有大問題

//可以把底下的if語句注釋掉,看看執行結果

if (setvbuf(fp, null, _ionbf, 0)!=0)

struct flock lock;

lock.l_type=f_wrlck;

lock.l_start=0;

lock.l_whence=seek_set;

lock.l_len=0;

struct flock unlock;

unlock.l_type=f_unlck;

unlock.l_start=0;

unlock.l_whence=seek_set;

unlock.l_len=0;

srand((unsigned int)time(null));

m=rand()%3+1;//每次消費的物品個數在3個以內

while(1)

printf("fifo檔案加鎖成功!/n"); 

rewind(fp);

fscanf(fp, "%d", &num);

printf("當前倉庫有%d個物品,消費者需要消費%d個物品!/n", num, m);

if (m>num)

printf("fifo檔案解鎖成功!/n");

sleep(2);

} else

printf("fifo檔案解鎖成功!/n");

m=rand()%3+1; }

} }

fifo檔案內容原始資料為0;

併發程式設計 讀寫鎖上鎖流程

目錄 併發程式設計之讀寫鎖上鎖流程 一 寫鎖上鎖流程 二 讀鎖上鎖流程 寫鎖的上鎖流程 slf4j topic liheng public class rwlock2 finally t1 t1.start 寫鎖在加鎖的時候要麼鎖沒有被人持有則會成功,要麼鎖是重入 否則都失敗 protected f...

檔案讀寫和IO Test

public class test1 從鍵盤接收乙個資料夾路徑 1,返回值型別file 2,引數列表無 public static file getdir else if dir.isfile else 統計該資料夾大小 1,返回值型別long 2,引數列表file dir public stati...

檔案讀寫和登錄檔讀寫

檔案讀寫和登錄檔讀寫 新增如下選單專案 響應 一 檔案讀寫 void cfileview onfilewrite void cfileview onfileread 二 登錄檔讀寫 按鈕響應 void cfileview onregwrite void cfileview onregread 三 初...