La llamada al sistema Linux access() muestra un comportamiento inconsistente

La llamada al sistema Linux access() muestra un comportamiento inconsistente

La llamada al sistema access() informa: "No existe tal archivo o directorio", para algunos archivos/directorios. Todos los directorios/archivos tienen los permisos solicitados. Su propietario/grupo es mi ID de inicio de sesión, al igual que el programa publicado a continuación. Además, el administrador de archivos muestra todos los archivos/directorios con los permisos correctos, propietario/grupo.

Específicamente, para algunos subdirectorios/archivos aparece el error. Pero para los mismos subdirectorios en los que obtuve el error, todos los archivos (y subdirectorios) se muestran sin errores.

¿Qué me falta por favor?

estructura directa *pDirent;

int principal(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;

}

Respuesta1

El nombre pasado a access() debe ser absoluto. En este caso, será la concatenación de v[1], "/" y pDirent->d_name en lugar de solo pDirent->d_name.

información relacionada