2009-12-12 2 views
4

Использует fchmod(int fildes, mode_t mode) лучше, чем использовать chmod (const char * path, mode_t mode)?Лучше ли использовать fchmod над chmod?

+1

В чем заключен контекст? –

+0

Мне было просто интересно. – PJT

+0

См. Ответ Omnifarious и, например, http://www.mail-archive.com/[email protected]/msg00128.html. Поэтому я бы сказал, что всегда используйте fchmod. –

ответ

8

Это почти идентично. chmod займет немного меньше времени, так как он должен преобразовать путь в индексный индекс или имя файла, тогда как fchmod имеет индекс inode/filenode, который уже просматривается.

Конечно, есть меньше условие ошибки, которые могут возникнуть с fchmod, так как файл уже известен, существует, имеет разрешения на открытом и т.д.

0

При обработке содержимого файла, у вас уже есть файловый дескриптор (либо потому, что вы использовали open() для его получения, либо потому, что вы использовали fopen() и можете использовать fileno() указатель FILE *, чтобы получить его), вы можете использовать fchmod(). Если вы не хотите открывать файл для какой-либо обработки, а только режим изменения, используйте chmod().

6

Это зависит от того, являются ли условия для соревнований проблемой или нет. С chmod вы рискуете, что кто-то переименует файл из-под вас и chmodding неправильного файла. В определенных ситуациях (особенно если вы root) это может быть огромная дыра в безопасности.

+0

Что делать, если кто-то переименовывает файл перед тем, как открыть файловый дескриптор на 'fchmod'? –

+0

Отличный пункт. Я нашел http://www.mail-archive.com/[email protected]/msg00128.html для примера в реальном мире. Благодаря! –

+0

@Checkers, это тоже возможность. Но после того, как вы откроете дескриптор файла, вы можете выполнить fstat и сравнить идентификатор пользователя и группы (или, возможно, посмотреть данные файла или, возможно, даже другие тесты), чтобы убедиться, что вы получили нужный файл. Кроме того, во многих случаях вы chmodding файл, который вы создали, и поэтому в открытом вызове нет условия гонки. – Omnifarious

Смежные вопросы