Системный вызов Linux access() демонстрирует непоследовательное поведение

Системный вызов Linux access() демонстрирует непоследовательное поведение

Системный вызов access() сообщает: "Нет такого файла или каталога" для некоторых файлов/каталогов. Все каталоги/файлы имеют запрошенные разрешения. Их владелец/группа - мой идентификатор входа, как и для программы, размещенной ниже. Кроме того, файловый менеджер показывает все файлы/каталоги с правильными разрешениями, владельцем/группой.

В частности, для некоторых подкаталогов/файлов я получаю ошибку. Но для тех же подкаталогов, на которых я получил ошибку, все файлы (и подкаталоги) отображаются без ошибок.

Что я упускаю?

struct dirent *pDirent;

int main(int c, char** v) {

DIR *pDir = opendir(v[1]);
if (!pDir) {
    cout << "Could not open: " << v[1] << endl;
    return 0;
}

while ((pDirent = readdir(pDir)) != NULL) {
    if (pDirent->d_name[0] == '.') continue;

    if (pDirent->d_type == DT_DIR) {
        if (access(pDirent->d_name, X_OK)) {
            cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
        }
        else cout << pDirent->d_name << endl;
    }
    else if (pDirent->d_type == DT_REG) {
        if (access(pDirent->d_name, R_OK | W_OK)) {
            cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
        }
        else cout << pDirent->d_name << endl;
    }
    else continue;
}

return 0;

}

решение1

Имя, переданное в access(), должно быть абсолютным. В этом случае это будет конкатенация v[1], "/" и pDirent->d_name вместо просто pDirent->d_name.

Связанный контент