多进程访问r/w配置文件(.ini格式)时,总是发生文件被破坏的情况问题的解决
如何解决这个问题呢?决定用文件锁。
有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编写的,容易移植。支持多进程访问,效率较高。有需要的兄弟,可以留言,发短信或邮件给我。
补充:软件开发 , C语言 ,