2015-03-05 1 views
0

платформы: 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. Но результаты такие же.

+2

Вы уверены, что 'lockf()' преуспевает? Вы игнорируете его возвращаемое значение, которое, как правило, является плохим. Кроме того, почему вы вызываете 'open()' с тремя аргументами в режиме «O_RDONLY»? Это не правильно. Вы должны проверить, что 'open()' преуспевает, прежде чем предположить, что это произошло. – unwind

+0

@unwind. Ты прав. Я предполагал слишком рано, не проверяя возвращаемое значение lockf. Спасибо за руководство. Возвращаемое значение при чтении равно -1. Что правильно.Я принимал это, потому что получил значение внутри файла. Извините за мою ошибку. –

ответ

1

Команда Lockf требует, чтобы файловый дескриптор был доступен для записи для версии F_LOCK.

На странице руководства:

ОШИБОК
EBADF ФД не является дескриптором открытого файла; или cmd - F_LOCK или F_TLOCK, а fd не является записываемым файловым дескриптором.

PS: @unwind, в точности, проверьте коды ошибок.

 Смежные вопросы

  • Нет связанных вопросов^_^