C C 業務 多程序同時讀寫同乙個檔案

2021-10-18 23:33:40 字數 3098 閱讀 7967

#include

intflock

(int fd,

int operation)

;

引數說明:

返回值說明:

返回0表示成功,若有錯誤則返回-1,錯誤**存於errno。

lock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。

使用方式:

flock只要在開啟檔案後,需要對檔案讀寫之前flock一下就可以了,用完之後再flock一下,前面加鎖,後面解鎖。

程序使用flock嘗試鎖檔案時,如果檔案已經被其他程序鎖住,程序會被阻塞直到鎖被釋放掉,或者在呼叫flock的時候,採用lock_nb引數,在嘗試鎖住該檔案的時候,發現已經被其他服務鎖住,會返回錯誤。

可呼叫lock_un引數來釋放檔案鎖,也可以通過關閉fd的方式來釋放檔案鎖(flock的第乙個引數是fd),意味著flock會隨著程序的關閉而被自動釋放掉

程序a:開啟要操作的檔案,進行加鎖,在檔案中寫入資料,等待鍵盤輸入字元(此時該a程序處於等待狀態,立刻執行b程序),鍵盤輸入字元後,發現加鎖檔案**現text字串

#include

#include

#include

#include

#include

static

const

char jsonfile=

"new.json"

;int

main()

;char text=

"this is write test*****====\n";if

((fp =

fopen

((jsonfile)

,"aw+"))

==null

)return0;

if(0==

flock

(fileno

(fp)

, lock_ex)

)else

return0;

}

程序b:開啟要操作的檔案,進行加鎖並設定立即返回引數,如果返回值是-1,說明檔案已被其他程序占用,然後進行持續加鎖,直到成功加鎖(此時刻是由於a程序在鍵盤中輸入了字元,釋放了鎖)睡眠2s後退出加鎖持續,對檔案進行資料追加寫入操作,發現在a程序中的text欄位後面出現了該b程序寫入的資料,即可說明檔案鎖生效,能成功保護檔案被兩個程序同時讀寫操作

#include

#include

#include

#include

#include

#include

#include

static

const

char jsonfile=

"new.json"

;int

main()

}}flock

(fileno

(fp)

, lock_un)

;fwrite

(texts,

strlen

(texts),1

, fp);}

fclose

(fp)

;return0;

}

被兩個程序同時操作的new.json資料檔案內容如下:

this is write test*****====

-----------this is read test

第二行資料在第一行資料出現2s後才出現

結果說明:驗證了flock函式在多程序操作同乙個檔案時對檔案的保護作用

多程序同時操作同乙個檔案無延時迴圈讀寫測試

程序a:

#include

#include

#include

#include

#include

static

const

char jsonfile=

"new.json"

;int

main()

else

}//usleep(500);

return0;

}

程序b:

#include

#include

#include

#include

#include

static

const

char jsonfile=

"new.json"

;int

main()

else

}//usleep(500);

return0;

}

經過測試兩個程序在乙個檔案中連續不斷寫入資料,寫入資料到該檔案達到100m後停止寫入,然後分析檔案中的資料

分析寫入資料正確性的程式:

#include

#include

static

const

char jsonfile=

"/home/nfs/new.json"

;char texts=

"this is write test*****===="

;char text=

"-----------this is read test"

;int

main()

;int bufflinenum =

0, num =0;

file *fp;if(

(fp =

fopen

(jsonfile,

"r+"))

==0)printf

("can't open file!\n");

while(!

feof

(fp)

)else}}

printf

("檔案總行數:%d\n出錯行數:%d\n"

, bufflinenum, num)

;return0;

}

解決多程序或多執行緒同時讀寫同乙個檔案的問題

解決多程序或多執行緒同時讀寫同乙個檔案的問題 php是沒有多執行緒概念的,儘管如此我們仍然可以用 不完美 的方法來模擬多執行緒。簡單的說,就是佇列處理。通過對檔案進行 加鎖和解鎖 來實現。當乙個檔案被乙個使用者操作時,該檔案是被鎖定的,其他使用者只能等待,確實不夠完美,但是也可以滿足一些要求不高的應...

Erlang防止同時註冊同乙個程序

從中學到了以下幾點 1 繫結程序,還是很方便滴。2 if和case的用法,據我目前的了解程度來看,if可以新增預設匹配規則 在if判斷語句中,應該至少有乙個是true,否則就會異常,一般把if最後乙個條件判斷設定為true,以匹配未匹配的規則 這點有點像c中case的default,而erlang中...

PHP解決多程序同時讀寫乙個

php解決多程序同時讀寫乙個檔案的問題 陌上花開 首先php是支援程序的而不支援多執行緒 這個先搞清楚了 如果是對於檔案操作,其實你只需要給檔案加鎖就能解決,不需要其它操作,php的flock已經幫你搞定了。用flock在寫檔案前先鎖上,等寫完後解鎖,這樣就實現了多執行緒同時讀寫乙個檔案避免衝突。大...