C fcntl функция абстракции не работает - PullRequest
1 голос
/ 10 января 2011

Я пишу приложение и оно в спецификации, что мне нужно блокировать файл каждый раз, когда я пишу на нем (этот файл будет считываться для других приложений, над которыми работает другая команда):

Iсделал следующую функцию:

int lock_file (int fd)
{
    if (fd == -1)
        return -1;
    struct flock file_locker;
    file_locker.l_type = F_WRLCK;
    file_locker.l_whence = SEEK_SET;
    file_locker.l_start = 0;
    file_locker.l_len = 0; //lock the entire file

    int locked = fcntl(fd, F_SETLK, &file_locker);
    if (locked == -1){
        /*handle errors*/
        return 0;
    }
    return 1;
}

Я могу получить возврат 1 (значит, все в порядке), но когда я сделал тестовый пример, я мог написать в заблокированном файле Oo

тестовый кодбыло:

char *file = "lock_test_ok";
int fd = open(file, O_RDWR);
int locked = lock_file(fd);
/* call popen and try write 'ERROR' in the file */

/* if the file contains ERROR, than fail */

Ответы [ 3 ]

5 голосов
/ 10 января 2011

Рекомендуется блокировка в Unix: только программы, тестирующие блокировку, не будут писать в нее.(Некоторые предлагают обязательную блокировку, но не таким способом. Обычно это требует настройки специальных свойств для заблокированного файла.)

2 голосов
/ 10 января 2011

Блокировка снимается, когда существует первый процесс и все его файловые дескрипторы закрыты.

Редактировать: Я думаю, что я неправильно понял сценарий тестирования - вызов popen() не будет следовать протоколу блокировки (который носит рекомендательный характер и не применяется ОС), поэтому происходит, даже если процесс, вызвавший lock_file(), все еще существует и удерживает блокировку.

0 голосов
/ 10 января 2011

В дополнение к тому, что сказал Джим, fcntl замки рекомендательны . Они не не позволяют никому открывать и записывать в файл. Единственное, что они делают, - это предотвращают получение другими процессами своих собственных fcntl блокировок.

Если вы управляете всеми программами записи в файл, это нормально, потому что вы можете просто сделать так, чтобы каждый автор попытался сначала заблокировать файл. В противном случае вы будете на месте. Unix не предлагает никаких «обязательных» блокировок (блокировок, которые вызывают сбой open или write).

...