Я открываю, а потом закрываю. Один процесс добавляет записи ABCDEFGHIJ. Другой процесс читает тот же файл и записывает ZZZZ. Обычный файл должен быть ZZZZ ABCDEFGHIJ
Но только однажды я увидел следующее: ZZZZEFGHIJ Итак, запись ABCDEFGHIJ повреждена с помощью ZZZZ.
Кажется, моя блокировка не работает. Но я проверил это. Один процесс действительно ждет другого. Может ли другой процесс записывать в файл между открытием и блокировкой? Или между разблокировкой и закрытием?
Код ниже
int MyOpenWrite(char *name,int flags) {
int fd
fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
LockFile(fd);
return fd;
}
int WriteFile(char *name, char *data) {
...
fd = MyOpenWrite(fullName,O_CREAT|O_WRONLY|O_TRUNC);
write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
}
int ReadFile(char *name, char *data, int maxLength) {
fd = open(name,O_RDONLY);
LockFile(fd);
...
UnLockFile(fd);
close(fd);
}
int AppendFile(char *name, char *data) {
fd = MyOpenWrite(fullName,O_WRONLY|O_APPEND);
...
len=write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
}
int LockFile(int fd) {
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}
int UnLockFile(int fd) {
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}
Я попытался закрыть (fd) разблокировку (fd). Кажется, это работает. Но в любом случае есть задержка между открытием и блокировкой. Спасибо.
fflush
-запись файла фактически записывает файл. - person Basile Starynkevitch   schedule 19.03.2013fflush
очищает буферы stdio. Это не гарантирует, что биты будут физически записаны ядром на диск. Вам нужноfsync
для этого. - person rra   schedule 19.03.2013