Страницы

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

воскресенье, 10 марта 2019 г.

Lock file in unix(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);
}


Ответ

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 открывает тот же файл, на который удерживается блокировка (на другом дескрипторе), читает его и закрывает. В момент закрытия блокировка теряется, как и описано выше.

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

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