赞
踩
Linux 中的 open 和 openat 系统调用都用于打开文件,但它们有一些区别。
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
#include <fcntl.h>
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
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
即可,也就是修改文件夹路径。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。