что происходит при вызове touch в linux? - PullRequest
0 голосов
/ 02 августа 2020

это очень конкретный c вопрос

Меня в основном интересуют системные вызовы open (), которые происходят при запуске touch .. Итак, я запустил strace touch . и увидел, что opennat () вызывается три раза.

, но я не совсем понимаю, что происходит; as touch . ничего не выводит в консоль и не создает новый файл с именем "." поскольку "." является указателем на текущую папку и его можно увидеть, запустив ls -a, поэтому ничего не создается, так как это имя уже используется.

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

поправьте меня, если я ошибаюсь.

1 Ответ

1 голос
/ 03 августа 2020

GNU touch предпочитает использовать дескриптор файла при прикосновении к файлам, поскольку можно записать touch - > foo и ожидать, что файл foo будет затронут. В результате он всегда пытается открыть указанный путь как файл с возможностью записи, и, если это возможно, затем использует этот файловый дескриптор для обновления метки времени файла.

В этом случае открыть * невозможно. 1006 * для записи, поэтому openat возвращает EISDIR. touch замечает, что это каталог, поэтому его вызов внутренней функции fdutimensat получает недопустимый файловый дескриптор и возвращается к использованию utimensat вместо futimens.

Это не так что вызов openat используется для проверки существования файла, но вместо этого использование дескриптора файла для многих операций означает, что вам не нужно иметь дело с разрешением пути несколько раз или обрабатывать символические ссылки, поскольку все они разрешаются, когда дескриптор файла открывается. Вот почему многие долгоживущие программы открывают файловый дескриптор в своем текущем рабочем каталоге, затем меняют каталоги, а затем используют файловый дескриптор с fchdir, чтобы вернуться. Любые изменения разрешений после запуска программы не являются проблемой.

...