Linux access() システムコールが一貫性のない動作を示す

Linux access() システムコールが一貫性のない動作を示す

システム コール access() は、一部のファイル/ディレクトリについて、「そのようなファイルまたはディレクトリはありません」と報告します。すべてのディレクトリ/ファイルは、要求された権限を持っています。それらの所有者/グループは、以下に掲載されているプログラムの場合と同様に、私のログイン ID です。また、ファイル マネージャーは、すべてのファイル/ディレクトリを、正しい権限、所有者/グループで表示します。

具体的には、一部のサブディレクトリ/ファイルでエラーが発生します。ただし、エラーが発生した同じサブディレクトリでは、すべてのファイル (およびサブディレクトリ) がエラーなしで表示されます。

何が足りないのでしょうか?

構造体 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() に渡される名前は絶対である必要があります。この場合、単なる pDirent->d_name ではなく、v[1]、"/"、および pDirent->d_name の連結になります。

関連情報