Der Linux-Systemaufruf access() zeigt ein inkonsistentes Verhalten

Der Linux-Systemaufruf access() zeigt ein inkonsistentes Verhalten

Der Systemaufruf access() meldet für einige Dateien/Verzeichnisse: „Keine solche Datei oder kein solches Verzeichnis“. Alle Verzeichnisse/Dateien haben die angeforderten Berechtigungen. Ihr Besitzer/ihre Gruppe ist meine Anmelde-ID, ebenso wie für das unten angegebene Programm. Außerdem zeigt der Dateimanager alle Dateien/Verzeichnisse mit den richtigen Berechtigungen, Besitzern/Gruppen an.

Insbesondere bei einigen Unterverzeichnissen/Dateien erhalte ich den Fehler. Aber bei denselben Unterverzeichnissen, bei denen der Fehler aufgetreten ist, werden alle Dateien (und Unterverzeichnisse) ohne Fehler angezeigt.

Was übersehe ich bitte?

Struktur 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;

}

Antwort1

Der an access() übergebene Name sollte absolut sein. In diesem Fall ist es die Verkettung von v[1], "/" und pDirent->d_name statt nur pDirent->d_name.

verwandte Informationen