使用Inotify时遇到了一些问题。我正在观看配置文件,希望在修改时重新加载配置。检测到修改没有问题,但是当我读取配置值时,我得到旧的值。我快就有了
attrib=value
我修改它所以它是
attrib =value1
然后,当我再次读取文件时,我会得到“value”而不是“value1”。如果我再次修改attrib,在阅读时我会得到“value1”。
编辑:PATH_FLDR_CONFIG指向文件本身。
以下是代码:
int length, i = 0;
int inotify;
char buffer[EVENT_BUF_LEN];
if((inotify = inotify_init())<0){
pthread_exit(NULL);
}
inotify_add_watch( inotify, PATH_FLDR_CONFIG , IN_MODIFY );
while (true){
i=0;
length = read( inotify, buffer, EVENT_BUF_LEN );
if (length<0) continue;
while ( i < length ) {
read( inotify, buffer, EVENT_BUF_LEN );
struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
if ( event->mask & IN_MODIFY ) {
readConfigFile();
}
i += EVENT_SIZE + event->len;
}
}
在readConfigFile()里面我做了一个configCreate +各种读取;
t_config *config_create(char *path) {
t_config *config = malloc(sizeof(t_config));
config->path = strdup(path);
config->properties = dictionary_create();
struct stat stat_file;
stat(path, &stat_file);
FILE* file = NULL;
file = fopen(path, "r");
if (file != NULL) {
char* buffer = calloc(1, stat_file.st_size + 1);
fread(buffer, stat_file.st_size, 1, file);
char** lines = string_split(buffer, "\n");
void add_cofiguration(char *line) {
if (!string_starts_with(line, "#")) {
char** keyAndValue = string_split(line, "=");
dictionary_put(config->properties, keyAndValue[0], keyAndValue[1]);
free(keyAndValue[0]);
free(keyAndValue);
}
}
string_iterate_lines(lines, add_cofiguration);
string_iterate_lines(lines, (void*) free);
free(lines);
free(buffer);
fclose(file);
}
return config;
}
char *config_get_string_value(t_config *self, char *key) {
return dictionary_get(self->properties, key);
}
答案 0 :(得分:2)
我不确定,但我认为有必要检查您的配置文件或其他文件上是否发生了MODIFY通知。
许多编辑通过首先编写临时文件来对文件进行更改。例如,如果您的文件名为config.txt
,则可以通过编写.config.txt.new#1234
然后将.config.txt.new#1234
重命名为config.txt
由于inotify位于目录上,因此可能会看到临时文件的创建和修改,触发通知,程序会在新文件替换之前读取配置。
另一个可能的问题是,只要在文件上调用write(),就会发生MODIFY事件。如果文件是在多次写入调用中写入的,则程序可能会在完全写入之前打开并读取配置文件。在您的示例中,如果配置字典未被新值覆盖,则配置字典可能包含旧值。
而不是MODIFY事件,请尝试使用CLOSE_WRITE。