Почему access (path, R_OK) вызвал существующий читаемый текстовый файл в \ usr \ local tree, возвращает ошибку - PullRequest
0 голосов
/ 12 июля 2019

Я работаю над приложением MacOS в XCode 10.2.Это приложение на разных языках (C, Objective-C и Swift).В части C он использует некоторые низкоуровневые вызовы unistd, в частности stat () и access ().

У меня есть строка пути к читаемому текстовому файлу в подкаталоге / usr / local /.Все соответствующие каталоги, начиная с / usr и ниже, имеют установленный атрибут 'r'.Строка пути правильная, потому что когда я вызываю stat () с использованием строки пути, stat () возвращается успешно, и когда я проверяю его результат, он действительно помечается как файл, а не как каталог.

Но затем, когда я вызываю access (path, R_OK) для него, access () возвращает ошибку с errno, установленным в 1 (EPERM), даже если «ls -l» в терминале показывает файл как имеющий доступ для чтения длявсе 3 уровня: -rw-r - r -

#include <unistd.h>
#include <sys/errno.h>
#include <sys/stat.h>           // For S_ISDIR() macro

...

struct stat info;
if (stat(&info, path) != nil) {
    if (!S_ISDIR(info.st_mode)) {
        if (access(path, R_OK)==0) {  // <-- Fails here
            return(0);
            }
        }
    }

return(errno);

Если я игнорирую вызов access (), а затем вызываю fopen () на пути, я также получаю там ошибку ввода-вывода.

Я читал, что в последних версиях MacOS (Mojave?) Должен быть список приложений, которые имеют разрешение на общий доступ к диску низкого уровня.Этим списком можно управлять только на панели «Системные настройки безопасности».Но я не могу использовать средство выбора приложений там, чтобы выбрать, что именно XCode работает, пока я отлаживаю и разрабатываю, который скрыт глубоко в каком-то дереве XCode в Библиотеке (которое в любом случае не отображается в списке приложений панели настроек).

Я просто хочу программно определить, доступен ли текстовый файл в дереве / usr / local / ... для чтения, а затем прочитать его.

...