Как моя программа на С может проверить, имеет ли она разрешение на выполнение для данного файла? - PullRequest
4 голосов
/ 13 февраля 2011

Есть ли способ определить, может ли процесс выполнить файл без необходимости его фактического выполнения (например, путем вызова execv(filepath, args) только для сбоя и обнаружения errno == EACCES)?

Я мог бы stat файл и наблюдать st_mode, но тогда я все еще не знаю, как это относится к процессу.

В идеале я ищу функцию в соответствии с

get_me_permissions(filepath, &status); // me: the process calling this function
// when decoded, status tells if the process can read, write, and/or execute 
// the file given by filepath.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 13 февраля 2011

Предполагая, что ваша конечная цель - в конечном итоге выполнить программу, вы этого не делаете. Этот тест был бы бесполезен, потому что результат потенциально неверен даже до того, как функция, выполняющая проверку, вернется! Вы должны быть готовы обработать ошибку execve из-за ошибок разрешения.

Как указал Стив Джессоп, проверка того, является ли данный файл исполняемым , может быть полезной в некоторых ситуациях, таких как вывод списка файлов (ls -l) или визуальный файловый менеджер. Можно, конечно, подумать о более эзотерическом использовании такого использования битов разрешения файла для межпроцессного взаимодействия (интересно как метод, который не требует выделения ресурсов), но я подозреваю, stat («Какие биты разрешения установлены to? "), а не access (" Имеет ли вызывающий процесс разрешение X? "), скорее всего, будет интересным вопросом ...

5 голосов
/ 13 февраля 2011

http://linux.die.net/man/2/access

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

...