Как проверить, является ли файл исполняемым в C ++? - PullRequest
2 голосов
/ 19 апреля 2011

Итак, у меня есть путь к файлу. Как проверить, является ли он исполняемым? (unix, C ++)

Ответы [ 6 ]

7 голосов
/ 19 апреля 2011

access (2):

#include <unistd.h>

if (! access (path_name, X_OK))
    // executable

Вызовы stat (2) имеют более высокие издержки при заполнении структуры.Если, конечно, вам не нужна эта дополнительная информация.

7 голосов
/ 19 апреля 2011

Проверка битов прав (статуса).

#include <sys/stat.h>

bool can_exec(const char *file)
{
    struct stat  st;

    if (stat(file, &st) < 0)
        return false;
    if ((st.st_mode & S_IEXEC) != 0)
        return true;
    return false;
}
4 голосов
/ 19 апреля 2011

Внизу справочной страницы для доступа имеется предупреждение (2):

CAVEAT Access () является потенциальной дырой в безопасности и никогда не должна использоваться.

Имейте в виду, что условие гонки существует между временем, когда вы вызываете access () со строкой пути, и временем, когда вы пытаетесь выполнить файл, указанный в строке пути, файловая система может измениться. Если это условие гонки, вызывает беспокойство, сначала откройте файл с помощью open () и используйте fstat () для проверки разрешений.

3 голосов
/ 19 апреля 2011

Вы, вероятно, хотите посмотреть на stat

3 голосов
/ 19 апреля 2011

Вы должны будете вызвать функцию POSIX stat(2) и исследовать поле st_mode объекта stuct stat, которое оно будет заполнять.

1 голос
/ 19 апреля 2011

Рассмотрите возможность использования access (2) , который проверяет разрешения относительно uid и gid текущего процесса:

#include <unistd.h>
#include <stdio.h>

int can_exec(const char *file)
{
    return !access(file, X_OK);
}

int main(int ac, char **av) {
    while(av++,--ac) {
        printf("%s: %s executable\n", *av, can_exec(*av)?"IS":"IS NOT");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...