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