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.mzph.cn/news/182916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常数据检测 | Python实现PCA和KMeans模型异常数据检测

文章概述 异常值检测(outlier)是一种数据挖掘过程,用于确定数据集中发现的异常值并确定其出现的详细信息。当前自动异常检测至关重要,因为大量数据无法手动标记异常值。自动异常检测具有广泛的应用,例如信用卡欺诈检测,系统健康监测,故障检测以及传感器网络中的事件检测…

前端开发_HTML

简介 CSS用于美化内容 HTML用于摆放内容 可以理解为HTML是基础&#xff0c;CSS是工具 HTML定义 HTML 超文本标记语言——HyperText Markup Language 超文本——链接 标记——标签&#xff0c;即带尖括号的文本 标签语法 双标签 开始标签&#xff1a; <xxx> 即尖…

点击元素以外的事件监听

在项目中&#xff0c;我们经常会遇到需要监听目标元素以外的区域被点击或鼠标移入移出等需求。 例如下面我们有一个表格里面嵌套表单的组件 我希望点击n行的时候&#xff0c;n行的元素变成表单元素进行输入或者选择&#xff0c; 当我点击其他其他区域n行又会恢复成数据展示…

WordPress插件大全-免费的WordPress插件汇总

随着互联网的不断发展&#xff0c;网站建设变得日益普及。对于大多数人而言&#xff0c;WordPress是一个熟悉且易于使用的网站建设平台。然而&#xff0c;有时候我们可能会觉得WordPress的功能还不够满足我们的需求&#xff0c;这时候&#xff0c;插件就成了解决问题的得力工具…

IMU传感器用于智能假肢

截肢会给截肢者们带来生活上的不方便和极大痛苦&#xff0c;因此假肢的优化一直被关注着。近期&#xff0c;一项关于新型智能膝关节的研究&#xff0c;让假肢能更好地模拟自然膝关节&#xff0c;给截肢者们带来了希望。 此款假肢内置IMU传感器&#xff0c;减少了截肢者所需的肌…

箭头函数与普通函数:谁更胜一筹?

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

MySQL分页查询方法及优化

文章目录 前言为什么要分页分页查询方法使用子查询优化使用 id 限定优化关于数据表的id说明后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正…

Spark local模式的安装部署

安装与配置Spark开发环境。 相关知识 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架&#xff0c;Spark拥有Hadoop MapReduce所具有的优点&#xff1b;但…

vuepress-----6、时间更新

# 6、时间更新 基于Git提交时间修改文字时间格式 moment # 最后更新时间 # 时间格式修改 下载库文件 yarn add momentconst moment require(moment); moment.locale(zh-cn)module.exports {themeConfig: {lastUpdated: 更新时间,},plugins: [[vuepress/last-updated,{trans…

BUUCTF [GXYCTF2019]BabyUpload 1详解(.htaccess配置文件特性)

题目环境&#xff1a;查看题目源码 SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性 倘若不先上传.htaccess配置文件&#xff0c;那么后台服务器就无法解析php代码 这个是需要注意的 .htaccess配置文件特性 概述来说…

calendar --- 日历相关函数

calendar --- 日历相关函数 源代码&#xff1a; Lib/calendar.py 这个模块让你可以输出像 Unix cal 那样的日历&#xff0c;它还提供了其它与日历相关的实用函数。 默认情况下&#xff0c;这些日历把星期一作为一周的第一天&#xff0c;星期天作为一周的最后一天&#xff08;这…

【面试】css预处理器之sass(scss)

目录 为什么引入css预处理器 可读性 嵌套&#xff1a;关系明朗 选择器 属性 伪类‘’ 变量&#xff1a;语义明确 默认变量&#xff1a;美元符号 $ 变量名:值 !default 全局变量&#xff1a;:global { $global-x: } 变量插值&#xff1a;#{} map键值对&#xff1a;$…

轻量封装WebGPU渲染系统示例<39>- emissive和arm纹理支持(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/DynamicShaderBuilding2.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class DynamicShaderBuildi…

python操作Mysql学习

文章目录 版权声明准备&#xff1a;MYSQL数据库数据库简介数据库分类数据库管理系统SQL语句关系型数据库中核心元素MySQL环境搭建Mysql数据类型数据完整性和约束MYSql基本操作登录和退出数据库命令数据库基本操作命令数据表基本操作命令数据表结构修改命令表数据操作命令Mysql查…

PCIe学习必读——《PCI Express System Architecture》

PCI Express (peripheral component interconnect express) 简称 PCIe&#xff0c;是一种高速串行计算机扩展总线标准。是一种全双工总线&#xff0c;使用高速串行传送方式&#xff0c;能够支持更高的频率&#xff0c;连接的设备不再像 PCI 总线那样共享总线带宽。PCIe目前发布…

Python基础入门例程74-NP74 字典新增(字典)

最近的博文: Python基础入门例程73-NP73 查字典(字典)-CSDN博客 Python基础入门例程72-NP72 生成字典(字典)-CSDN博客 Python基础入门例程71-NP71 喜欢的颜色(字典)-CSDN博客 目录 最近的博文:

数据结构-二叉树(2)

3.4堆的应用 3.4.1 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 1.升序&#xff1a;建大堆&#xff1b; 2.降序&#xff1a;建小堆。 2. 利用堆删除思想来进行排序 这种写法有两个缺点&#xff1a; 1、先有一个堆的数据结构 …

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员&#xff1a;个人中心&#xff0c;用户管理&#xff0c;热点信息管理&#xff0c;疾病管理&#xff0c;疾病类型管理&#xff0c;治疗管理&#xff0c;治疗类型管理&#xff0c;护理管理&#xff0c;护理类型管理&#xff0c;科普管理&#xff0c;科普类型…

如何利用轮廓系数(Silhouette Coefficient)来判断模糊c均值聚类FCM的聚类簇数量

文章目录 前言一、轮廓系数的计算方法二、具体流程 前言 轮廓系数&#xff08;Silhouette Coefficient&#xff09;是一种评价聚类效果的指标&#xff0c;它可以用于判断模糊C均值聚类的聚类簇数量。 一、轮廓系数的计算方法 对于每个数据点i&#xff0c;计算它属于每个聚类…

游戏动作师效能汇报以及交接流程规范

游戏动作师效能汇报以及交接流程规范 效能部分 一段300帧以内的表演类或连招动作手K大概需要2-3天时间。&#xff08;不含蒙皮时间&#xff09;当然也根据内容的复杂程度而定&#xff0c;一般会预出1-2天。 一般蒙皮会给予1-2天的时间&#xff08;根据蒙皮精细程度&#xff…