Проверяется наличие блокировки или неблокирования файлов или папок? - PullRequest
1 голос
/ 01 июня 2019

Проверяет наличие блокировки или неблокирования файла или папки?

access( fname, F_OK ) // blocking ?

Открытие каталога / файла блокируется или неблокируется?

opendir(dir); // blocking?
open(fd..); // blocking?

Список dir блокируется или не блокируется?

readdir // blocking?

Под блоком я имею в виду, что возвращение занимает много времени.

1 Ответ

4 голосов
/ 01 июня 2019

(я предполагаю, что вы имеете в виду «блок» в том смысле, что он обычно используется в руководствах по Unix и соответствующей документации: то есть вы спрашиваете, могут ли эти операции включать вызывающий процесс, ожидающий в течение длительного периода времени для ввода-вывода дляЗавершите. Если это не то, что вы имеете в виду, отредактируйте свой вопрос, чтобы уточнить.)

Краткий ответ: все эти системные вызовы могут потенциально блокировать.

Длинный ответ:

  • проверка существования файла или папки: никогда не делайте этого , это вводит в вашу программу условие гонки TOCTOU .За 20 лет системного программирования Unix я буквально никогда не сталкивался с ситуацией, когда системный вызов access был бы правильным выбором.Вместо этого просто попытайтесь открыть файл, введите каталог и т. Д. И проверьте, не удалось ли это.

    Сказав, что access, stat и lstat могут блокировать то же самоепричины open можно (обсуждается ниже).fstat не гарантировано не блокировать, но обычно можно предположить, что не будет.

  • open и opendir могут блокировать, даже если вы используете O_NONBLOCK.Наиболее распространенный случай, когда это происходит, когда файл или каталог, который вы пытаетесь открыть, находится в удаленной файловой системе, поэтому для выяснения того, существует ли файл и есть ли у вас доступ к нему, необходимо отправить пакеты по сети.

    В POSIX API нет никакого способа обойти это, потому что нет способа представить текущую open операцию.Сетевой API отделяет создание сокета (socket, который не может заблокировать) от запроса на подключение его к удаленному узлу (connect, который может), поэтому, когда connect возвращает -1 с установленным errnoна EINPROGRESS, вы уже знаете номер дескриптора сокета, и вы можете select на нем.Если бы open дал вам EINPROGRESS, у вас не было бы файлового дескриптора для select вкл.

  • readdir может блокировать по тем же причинам, что и старый read может заблокировать.Опять же, наиболее распространенный случай, когда вы заметите, когда каталог находится в удаленной файловой системе.Проблема в этом случае заключается в том, что абстракция DIR мешает обычному неблокирующему вводу / выводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...