Вопрос

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

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

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 */
Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top