c - 使用 openat 重新打开一个目录

标签 c linux

看起来,可以使用 openat()重新打开一个已经打开的目录。例如,在我的 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;
}

我在任何地方都找不到这个文档,感觉有点像边缘案例。我也没有找到其他代码这样做。这是明确定义的行为吗?

编辑:更改标题:文件 -> 目录

最佳答案

这与调用 open 相同在同一个文件上两次,您可以这样做:

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

哪里filename指的是现有文件(任何类型)和 flags1flags2是任何一组 O_可以有效应用于该类型文件并且不会破坏其内容的标志。 (特别是,我们假设它们不包括 O_CREATO_TRUNCO_EXCL 。)

fd1fd2将引用单独的“open file descriptions”,例如lseek一个不会影响另一个,flock一个会阻塞 flock另一方面,等等。

关于c - 使用 openat 重新打开一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54793898/

相关文章:

c - 为什么字符串的字节大小比长度长?

linux - ioctl 驱动程序函数是从 linux 2.6 下的原子上下文执行的吗?

linux -/etc/nsswitch.conf 更改后,Docker 容器中的 Oracle Java 无法解析主机名

python - "is"报告子进程通信错误()

c - POSIX 计时器以预期频率的两倍运行

Linux 在多个文件上写东西

在 C 中比较以空字符结尾的字符串和非以空字符结尾的字符串

c - 我的 C 代码中的段错误需要帮助

c - 将自定义库添加到 C 程序

c - 为什么在某些情况下编译和链接 C 代码时不需要 -lm?