открыть каталог с помощью openat - PullRequest
0 голосов
/ 20 февраля 2019

Как представляется, можно использовать openat() до re , чтобы открыть уже открытый каталог.Например, в моей системе Linux я могу сделать следующее:

#define _GNU_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(void) {

    int fd1 = open(".", O_PATH);
    if (fd1 == -1) {
        perror("open");
        return 1;
    }
    int fd2 = openat(fd1, ".", O_RDONLY);
    if (fd2 == -1) {
        perror("openat");
        close(fd1);
        return 1;
    }
    close(fd1);

    // do fancy things with fd2, now opened
    // with access mode read-only

    return 0;
}

Я не смог найти это нигде в документации, и это похоже на крайний случай.Также я не нашел другой код, делающий это.Это четко определенное поведение?

РЕДАКТИРОВАТЬ: изменил заголовок: файл -> каталог

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

При openat() первый аргумент, fd, должен быть дескриптором файла для каталога, например, того, который вы получили при открытии ".", или специального значения AT_FDCWD(что означает открытые относительные пути относительно текущего каталога).Обратите внимание, что опция O_PATH, которую вы используете, является расширением только для Linux openat().

Итак, поскольку вы используете допустимый файловый дескриптор для каталога, вызовopenat() должно быть успешным.Теперь у вас есть два файловых дескриптора, каждый из которых указывает (независимо - с отдельными описаниями открытых файлов) на текущий каталог.Как правило, один и тот же файл можно открывать несколько раз в одном процессе (или в нескольких процессах - обеспечение доступа к одному процессу на Unix-подобных (POSIX) системах действительно очень сложно).

Тамс этими дескрипторами вы не можете ничего сделать, кроме как использовать их в *at() системных вызовах.Любой из файловых дескрипторов был бы достаточен;открытие обоих было излишним.

0 голосов
/ 20 февраля 2019

Это то же самое, что дважды open вызывать один и тот же файл, что вам разрешено делать:

int fd1 = open("filename", flags1);
int fd2 = open("filename", flags2);

, где filename относится к существующему файлу (любого типа) иflags1 и flags2 - это любой набор флагов O_, которые могут быть корректно применены к этому типу файла и не уничтожат его содержимое.(В частности, мы предполагаем, что они не включают O_CREAT, O_TRUNC или O_EXCL.)

fd1 и fd2 будут ссылаться на отдельные " описания открытых файлов", например, lseek на одном не повлияет на другой, flock на одном заблокирует flock на другом и т. Д.

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