2014-02-20 5 views
5

У меня есть следующий код, где я хочу проверить, заблокирован ли файл или нет. Если нет, то я хочу написать ему. Я запускаю этот код, запуская их одновременно на двух терминалах, но я всегда получаю статус «заблокирован» каждый раз на обеих вкладках, даже если я его не заблокировал. Код ниже:Как проверить, заблокирован ли файл или нет?

#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    struct flock fl,fl2; 
    int fd; 

    fl.l_type = F_WRLCK; /* read/write lock */ 
    fl.l_whence = SEEK_SET; /* beginning of file */ 
    fl.l_start = 0;  /* offset from l_whence */ 
    fl.l_len = 0;  /* length, 0 = to EOF */ 
    fl.l_pid = getpid(); /* PID */ 

    fd = open("locked_file", O_RDWR | O_EXCL | O_CREAT); 
    fcntl(fd, F_GETLK, &fl2); 
    if(fl2.l_type!=F_UNLCK) 
    { 
     printf("locked"); 
    } 
    else 
    { 
     fcntl(fd, F_SETLKW, &fl); /* set lock */ 
     write(fd,"hello",5); 
     usleep(10000000); 
    } 
    printf("\n release lock \n"); 

    fl.l_type = F_UNLCK; 
    fcntl(fd, F_SETLK, &fl); /* unset lock */ 
} 

ответ

3

Очень просто, просто запустите fnctl с F_GETLK вместо F_SETLK. Это установит данные на вашем указателе на текущее состояние блокировки, вы можете посмотреть, будет ли он заблокирован, а затем получить доступ к свойству l_type.

посмотрите пожалуйста: http://linux.die.net/man/2/fcntl подробности.

+0

, но 'F_GETLK' уже установлен в опубликованном коде, а исходное сообщение не редактируется. вы можете объяснить ответ немного. Я не могу себе представить, почему этот ответ принят? есть что-то, чего я не заметил? – Anubis

+0

@ Anubis Я думаю, что это было принято, потому что OP нашел ответ в приведенной выше ссылке. Я оставил свой собственный ответ, объяснив, что я нашел неправильным с кодом OP. – HSchmale

1

Вы также должны fl2 быть memset 0. В противном случае при использовании fcntl(fd, F_GETLK, &fl2) и perror на неудачу, вы увидите сообщение как таковое на терминале:

Fcntl: Invalid Arguement

Я рекомендую использовать perror при отладке системных вызовов.

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