Будет ли следующий код работать для правильного ответа на вопрос? - PullRequest
0 голосов
/ 04 ноября 2019

Напишите функцию C, которая принимает имя файла в качестве своего параметра и возвращает true, если данный файл существует, является обычным файлом, и у кого-то есть разрешение на выполнение, и false в противном случае.

int is_program(char *fname){
    struct stat sb;
    int res;

    res = stat(fname, &sb);

    if(res == 0)/*if file exists*/
    {
        if(S_ISREG(sb.st_mode) & (S_IXUSR | S_IXGPR | S_IXOTH))
            return 1;
        else
            return 0;
    }
    return 0;
}

1 Ответ

1 голос
/ 04 ноября 2019

Нет;то, что у вас есть, не будет выполнять требуемую работу.

Вам необходимо отделить тест для обычного файла:

ISREG(sb.st_mode)

от теста на исполняемость:

(sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))

Следовательно, вы можете использовать:

return (ret == 0) && ISREG(sb.st_mode) && (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH));

Вы могли бы разумно предпочесть разделить его:

if (ret != 0)
    return 0;
if (!ISREG(sb.st_mode))
    return 0;
return (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...