Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Lock file in unix(Solaris)

#c #файлы #unix #exec #solaris


Вопрос следующий: в man-е Solaris написано, что захват файлов наследуется при exec,
однако, когда я захватываю файл на запись, а затем вызываю execlp(...) — открываю файл
в редакторе. Затем я создаю новую сессию и запускаю ту же программу, по идее процесс
должен остановиться в ожидании из-за флага F_SETLKW в fcntl(), но он также открывает
редактор... В чем может быть дело? 

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define editor "nano"

int main(int argc, char *argv[]) {
    struct flock lock;
    int fd;

    if ((fd = open(argv[1], O_RDWR)) == -1) {
            perror("Cannot open file");
            exit(EXIT_FAILURE);
    }
    lock.l_type = F_WRLCK;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;

    if (fcntl(fd, F_SETLKW, &lock) == -1) {
            perror("fcntl failed");
            exit(EXIT_FAILURE);
    }

    execlp(editor, editor, argv[1], NULL);
    perror("exec is not working");
    exit(EXIT_FAILURE);

}

    


Ответы

Ответ 1



man 2 fcntl (Solaris) All locks associated with a file for a given process are removed when a file descriptor for that file is closed by that process or the process holding that file descriptor terminates В linux этот момент расписан более подробно: man 2 fcntl (Linux [man-pages-ru]) Если процесс закрывает любой файловый дескриптор, ссылающийся на файл, то освобождаются все блокировки процесса для этого файла, независимо от файлового дескриптора(ов), на который получена блокировка. Это плохо: это означает, что процесс может потерять свои блокировки на файл, такой как /etc/passwd или /etc/mtab, когда какой-либо причине библиотечная функция решает их открыть, прочитать и закрыть. В данном случае происходит следующее: nano открывает тот же файл, на который удерживается блокировка (на другом дескрипторе), читает его и закрывает. В момент закрытия блокировка теряется, как и описано выше.

Комментариев нет:

Отправить комментарий