платформы: UBUNTU 14,4блокировки файла с использованием lockf в C не работает
GCC версии: 4.8.2
Язык: C
Ситуация:
У меня есть два файла для проверки функции lockf.One - это написать и другой - читать.
Во время записи целевой файл должен быть заблокирован, таким образом отключив чтение, чтобы открыть тот же файл.
Проблема:
Когда я запустить программу записи, я просто оставить его в ожидании ввода пользователя и запустить программу для чтения. Как-то прочитанное может получить информацию в целевом файле. Это означает, что lockf в записи не фиксирует его правильно. Почему я терпеть неудачу?
Код:
read.c
int main()
{
char buffer[4];
char *filename = "/home/fikrie/Documents/test_lockf/file.txt";
int fd;
fd = open(filename, O_RDONLY, 0644);
lockf(fd, F_LOCK, 3);
while (1) {
if (read(fd, buffer, 3) == -1) {
printf("Error getting file");
break;
} else {
printf("%s",buffer);
getchar();
}
}
close(fd);
lockf(fd, F_ULOCK, 0);
return 0;
}
write.c
int main()
{
char buffer;
char *filename = "/home/fikrie/Documents/test_lockf/file.txt";
int fd;
fd = open(filename, O_WRONLY | O_APPEND, 0644);
lockf(fd, F_LOCK, 3);
while(1) {
buffer = getchar();
if (buffer != 'q') {
write(fd,"ABC",3);
write(fd,":",1);
}
else {
break;
}
}
close(fd);
lockf(fd, F_ULOCK, 0);
return 0;
}
и т.д.:
На странице человека,
lockf(int fd, int function, off_t size);
размер аргумент число смежных байтов, которые будут заблокированы или разблокированы. Раздел, который нужно заблокировать или разблокировать, начинается с текущего смещения в файле и продолжается вперед для положительного размера или назад для отрицательного размера.
Я думал, что передал неправильное значение аргументов размера, поэтому я также пробовал передавать 0. Но результаты такие же.
Вы уверены, что 'lockf()' преуспевает? Вы игнорируете его возвращаемое значение, которое, как правило, является плохим. Кроме того, почему вы вызываете 'open()' с тремя аргументами в режиме «O_RDONLY»? Это не правильно. Вы должны проверить, что 'open()' преуспевает, прежде чем предположить, что это произошло. – unwind
@unwind. Ты прав. Я предполагал слишком рано, не проверяя возвращаемое значение lockf. Спасибо за руководство. Возвращаемое значение при чтении равно -1. Что правильно.Я принимал это, потому что получил значение внутри файла. Извините за мою ошибку. –