引數說明:#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字串
程序b:開啟要操作的檔案,進行加鎖並設定立即返回引數,如果返回值是-1,說明檔案已被其他程序占用,然後進行持續加鎖,直到成功加鎖(此時刻是由於a程序在鍵盤中輸入了字元,釋放了鎖)睡眠2s後退出加鎖持續,對檔案進行資料追加寫入操作,發現在a程序中的text欄位後面出現了該b程序寫入的資料,即可說明檔案鎖生效,能成功保護檔案被兩個程序同時讀寫操作#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;
}
被兩個程序同時操作的new.json資料檔案內容如下:#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;
}
this is write test*****====第二行資料在第一行資料出現2s後才出現-----------this is read test
結果說明:驗證了flock函式在多程序操作同乙個檔案時對檔案的保護作用
多程序同時操作同乙個檔案無延時迴圈讀寫測試
程序a:
程序b:#include
#include
#include
#include
#include
static
const
char jsonfile=
"new.json"
;int
main()
else
}//usleep(500);
return0;
}
經過測試兩個程序在乙個檔案中連續不斷寫入資料,寫入資料到該檔案達到100m後停止寫入,然後分析檔案中的資料#include
#include
#include
#include
#include
static
const
char jsonfile=
"new.json"
;int
main()
else
}//usleep(500);
return0;
}
分析寫入資料正確性的程式:
#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在寫檔案前先鎖上,等寫完後解鎖,這樣就實現了多執行緒同時讀寫乙個檔案避免衝突。大...