Есть небольшое преимущество.Посмотрите 'LBYL против EAFP' или 'Посмотрите, прежде чем вы прыгните' против 'Проще просить прощения, чем разрешения'.
Небольшое преимущество заключается в том, что системный вызов stat()
должен анализироватьимя каталога и получить к inode - или к отсутствующему inode в этом случае - и затем mkdir()
должен сделать то же самое.Конечно, данные, необходимые для mkdir()
, уже находятся в пуле буферов ядра, но они все же включают два обхода указанного пути вместо одного.Таким образом, в данном случае, это немного более эффективно использовать ЭСПЦ, чем использовать LBYL, как вы делаете.
1009 * Тем не менее, независимо от того, что действительно измеримый эффект в средней программе весьма спорно.Если вы не делаете ничего, кроме создания каталогов повсюду, то вы можете обнаружить выгоду.Но это определенно небольшой эффект, по сути неизмеримый, если вы создаете один каталог в начале программы.
Возможно, вам придется иметь дело со случаем, когда strcmp(dir, "/some/where/or/another") == 0
, но, хотя "/some/where"
существует, ни"/some/where/or"
ни (по необходимости) "/some/where/or/another"
не существует.Ваш текущий код не обрабатывает недостающие каталоги в середине пути.Он просто сообщает ENOENT, что mkdir()
сообщит.Ваш код, который выглядит, не проверяет, что dir
на самом деле является каталогом, - он просто предполагает, что если он существует, то это каталог.Правильная обработка этих вариаций сложнее.