当前位置: 首页 > article >正文

open与openat的区别

Linux 中的 open 和 openat 系统调用都用于打开文件,但它们有一些区别。

一、函数原型

open 系统调用的原型

#include <fcntl.h>

int open(const char *pathname, int flags, mode_t mode);
  • pathname 是要打开的文件路径
  • flags 是打开文件的标志
  • mode 是文件的权限。
    open 系统调用会在文件系统中查找 pathname 指定的文件,并返回一个文件描述符,用于后续的读写操作。

openat 系统调用的原型

#include <fcntl.h>

int openat(int dirfd, const char *pathname, int flags, mode_t mode);
  • dirfd 是一个文件描述符
  • pathname 是相对于 dirfd 的路径
  • flags 和 mode 的含义与 open 系统调用相同。
    openat 系统调用会在 dirfd 指定的目录下查找 pathname 指定的文件,并返回一个文件描述符。

二、openat使用场景

openat 系统调用相对于 open 系统调用的优势在于,它可以避免一些安全问题。在多线程或多进程环境中,使用 open 系统调用打开文件时,可能会存在竞态条件,导致打开的文件不是预期的文件。而使用 openat 系统调用,可以避免这个问题,因为它是基于一个已经打开的目录文件描述符进行查找的,不需要再次查找文件路径。

此外,openat 系统调用还可以用于打开相对于某个符号链接的路径的文件,而 open 系统调用则不能。

https://www.cnblogs.com/BinBinStory/p/7400993.html

引入openat是方便一个进程内的各线程可拥有不同的当前目录,使用chdir会影响整个进程,而使用openat只需要每个线程在初始化时打开一个目录获得dirfd(调用open),然后就可以openat在“当前目录”操作文件了,如下伪代码所示:

int dirfd = open("/tmp"); // 相当于chdir到“/tmp”
int filefd = openat(dirfd, "myfile"); // 在/tmp目录下打开“myfile”文件 。

At means that the working directory considered for the open call is at the given file descriptor, passed as the parameter. The *at() family of functions are useful so that all path relative operations refer to the same file inode, even if it changes name or someone replaces it.

个人觉得这句话靠谱,at一直以相对路径来读取文件信息,相对于绝对路劲,当文件换了一个路径时:

  • 程序中需要读写该路径下的多个文件,如果使用open实现,那么需要修改程序中所有open文件的绝对路径。
  • 使用openat,只需要修改传入参数dirfd即可,也就是修改文件夹路径。

http://www.kler.cn/a/150093.html

相关文章:

  • Java中的System类、Runtime类、Math类、BigInteger类、BigDecimal类、Random类
  • 【C++、数据结构】哈希表——散列表(一)(概念/总结)
  • 杨传辉:云+AI 时代的一体化数据库|OceanBase发布会实录
  • C++:AVL树
  • fpga 常量无法改变
  • TecoPytorch
  • Linux uname命令教程:如何打印linux操作系统名称和硬件的基本信息(附实例教程和注意事项)
  • SCI的写作前提——认识论文的本质
  • Python+requests+Jenkins接口自动化测试实例
  • linux查询某个进程使用的内存量
  • 复位电路的电阻电容的作用
  • 如何设置Linux终端提示信息
  • Qt 信号与槽简介
  • 案例:某电子产品电商平台借助监控易保障网络正常运行
  • unity shaderGraph实例-可交互瀑布
  • C++ day45 爬楼梯 零钱兑换 完全平方数
  • 大数据基础设施搭建 - Sqoop
  • AI搜索相关性在网站和APP上的应用
  • 致远M3 反序列化RCE漏洞复现(XVE-2023-24878)
  • C++算法入门练习——数据流第K大元素
  • JavaWeb | JSP访问数据库、JDBC操作
  • 学习计划计划执行记录
  • 【数据结构】——解决topk问题
  • 存储服务器特征是什么
  • 零基础学Python的第四天||字符串(1)
  • 力扣:184. 部门工资最高的员工(Python3)