[問題] 關於 Lock a file 的現象之請教
開發環境 : FreeBSD 6.2-RELEASE-p1
程式語言 : C with gcc version 3.4.6
問題敘述 :
前陣子用 C 寫了支小程式
主要動作之一: lock 指定檔案
邏輯想法: ( Process 行為, 跟等會介紹的 P1 和 P2 內容 )
FILE *fd ;
fd = fopen( "target" , "r+" );
LockFileByPtr( fd );
// 接著對 "target" file 做更新
...
// 更新完 unlock
UnlockFileByPtr( fd );
補充資訊:
void LockFileByPtr( FILE * fd )
{
if( flock( fileno( fd ) , LOCK_EX ) != 0 )
{
perror(" Error @ LockFilePtr ");
exit(1);
}
}
void UnlockFileByPtr( FILE * fd ) // 印象中直接 fclose 也行?!要查查
{
if( flock( fileno( fd ) , LOCK_UN ) != 0 )
{
perror(" Error @ UnlockFileByPtr ");
exit(1);
}
fclose( fd );
}
看起來似乎沒啥問題
但多支程式在跑時就開始會出錯 :P 資料並不正確
也有可能是我自己寫的 LockFileByPtr 有問題
猜測的可能性:
P1, P2 是相同的程式, 目的就只是把檔案內的數字讀出來加一再存進去
假設 P1, P2 兩支程式同時進行, 而 P1 首先搶到執行權
P2 則是完成了 fopen 的動作後執行 LockFileByPtr
並且卡住等待 P1 的資源釋放, 而接著 P1 執行完後, 換 P2 搶到執行資源
這時, 會不會是因為系統對檔案有一些 buffer 機制?!
導致 P2 先前完成的 fopen 動作, 因此讀取到的資料不會是 P1 更新後的資料?
因此最後沒有達到同步的效果?!
想請問有沒有對這塊有經驗呢??
目前我的處理, 就是額外再加一個不重要的檔案進行 lock 而已 @_@
這樣的結果是正確的
但是設計上個人是覺得不太恰當
因為 lock 本身就是對指定的檔案做上標記 這樣在同個 OS 下
其他程式在開始時 就不一定需要綁著我開發的架構
不需知道要對某個不重要的檔案進行 lock
另外 如果上述我猜測的情況是對的
那有什麼方式可以跟 OS 說開檔時不要 buffer 嗎??
感謝觀看 謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.217.56
※ 編輯: changyy 來自: 140.123.217.56 (04/20 17:37)
推
04/20 18:21, , 1F
04/20 18:21, 1F
推
04/20 18:24, , 2F
04/20 18:24, 2F
→
04/20 18:25, , 3F
04/20 18:25, 3F
→
04/20 18:27, , 4F
04/20 18:27, 4F
→
04/20 18:34, , 5F
04/20 18:34, 5F
→
04/20 18:35, , 6F
04/20 18:35, 6F
推
04/20 18:54, , 7F
04/20 18:54, 7F
推
04/20 18:57, , 8F
04/20 18:57, 8F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):