最近在工作中遇到一个问题?在使用libconfig开源库读写配置文件时,发现会读写冲突,后来在libconfig库的源代码添加调试信息,发现开源的libconfig源代码config_read_file()、config_write_file()这两个函数是没有对读写配置文件添加锁导致的。
发现问题的原因之后,我就尝试修改源代码,添加对读写配置文件添加锁,具体添加代码如下:
未添加锁int config_read_file(config_t *config, const char *filename){
int ret;
FILE *stream = fopen(filename, "rt");
if(! stream)
{
config->error_text = __io_error;
config->error_type = CONFIG_ERR_FILE_IO;
return(CONFIG_FALSE);
}
ret = __config_read(config, stream, filename, NULL);
fclose(stream);
return(ret);
}
已添加锁的int config_read_file(config_t *config, const char *filename)
{
int ret;
FILE *stream ;
int fd = open(filename,O_RDONLY);
struct flock lock;
if(fd < 0)
{
config->error_text = __io_error;
config->error_type = CONFIG_ERR_FILE_IO;
return(CONFIG_FALSE);
}
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = F_RDLCK;
lock:
if ((fcntl(fd, F_SETLKW,&lock))==-1) {
if (errno == EINTR)
{
goto lock;
}
else
{
config->error_text = __io_error;
config->error_type = CONFIG_ERR_FILE_IO;
fprintf(stderr,"%s,%d: set readlock err!\n",__FUNCTION__,__LINE__);
return(CONFIG_FALSE);
}
}
stream = fopen(filename, "rt");
if(! stream)
{
close(fd);
config->error_text = __io_error;
config->error_type = CONFIG_ERR_FILE_IO;
return(CONFIG_FALSE);
}
ret = __config_read(config, stream, filename, NULL);
fclose(stream);
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = F_UNLCK;
unlock:
if ((fcntl(fd, F_SETLKW,&lock))==-1) {
if (errno == EINTR) {
goto unlock;
}
}
close(fd);
return(ret);
}
config_write_file()添加锁参考config_read_file()添加。
第一次写工作日志,第一次写博客,写的不好的地方,请大家多多鼓励,我决定坚持把工作中遇到问题,以博客的方式记录下来,一方面对自己工作遇到问题的总结,另一方面希望对大家遇到同样问题时,提供参考帮助。。。。。
阅读(1192) | 评论(0) | 转发(0) |