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