如何解決這個問題呢?決定用文件鎖。
有BSD方式和POSIX格式的文件鎖,如下:
#if (CFG_FLOCK_BSD==1)
ret=flock(fd,LOCK_SH);
if (ret!=0) //can not get R_lock when writting
{
ret=-100;
goto End;
}
#elif (CFG_FLOCK_POSIX==1)
ret=_SimpleSetPosixLock(fd,F_RDLCK);
if (ret<0) //can not get R_lock when writting
{
ret=-100;
goto End;
}
#endif
加了文件鎖後,仍然發生這種情況。一度懷疑是文件鎖本身有問題。
最後發現,其實是stat 出來的file size不正確導致的。
用ret=fstat(fd,&sb);取代//stat (pconfig->fileName, &sb); 就沒有問題了。
根據文件名來stat file size,就有可能發生文件正在被另一個進程write時,這時根據不正確的size將文件讀進內存,在commit時寫回文件,於是就出錯了。
正確的操作流程是:
打開文件-->申請讀鎖-->成功則fstat size,並根據size讀文件入內存中。
這樣就不會發生文件被損壞的情況了。
當然,ini文件操作本身提供的API也有缺陷,在ret返回失敗時,沒有去置出口參數。
返回值失敗時,也將出口參數置為非法值。
#define NULL_STR '\0'
#define NULL_VAL 0xFFFF
Ini配置文件是純ANSI C編寫的,容易移植。支持多進程訪問,效率較高。有需要的兄弟,可以留言,發短信或郵件給我。