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

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.lryc.cn/news/247997.html

相关文章:

  • 人工智能与供应链行业融合:预测算法的通用化与实战化
  • Cytoscape学习教程
  • computed和watch相关
  • 反思一次效能提升
  • ElasticSearch之cat indices API
  • Composer update 跳过指定依赖
  • @RequestMapping详解:请求映射规则
  • C#中密封类和密封方法
  • Pytorch中的Net.train()和 Net.eval()函数讲解
  • 氪了几百亿,字节游戏停止了“跳动”
  • 进入docker容器
  • C陷阱与缺陷——第5章库函数
  • 【C++上层应用】6. 信号 / 中断
  • 树与二叉树堆:堆的意义
  • 什么时候适合做ui自动化测试?什么时候做接口自动化测试
  • [ABC261E] Many Operations(dp,位运算,打表)
  • 一、爬虫-爬取豆瓣电影案例
  • 4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控
  • 武汉数字孪生赋能工业制造,加速推进制造业数字化转型
  • 安卓密码框、EditText
  • ROS命令行工具
  • 深入浅出 Golang 中的直接依赖和间接依赖管理
  • 深入Python元编程:了解声明与初始化定制元类
  • [传智杯初赛] 期末考试成绩
  • Linux 常用基本命令
  • 阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?
  • 二分查找(折半查找)探究学习
  • Android : 异常记录
  • 西南科技大学电路分析基础实验A1(元件伏安特性测试 )
  • 【Java】泛型的简单使用