openat() - Unix、Linux 系统调用 - 技术教程
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于TP  

openat() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

openat - 相对目录文件描述符打开文件

语法

#include <fcntl.h> 

int openat(int dirfd, const char *pathname, int flags); int openat(int dirfd, const char *pathname, int flags ", mode_t " mode );

描述

openat() 系统调用与 open(2) 的操作方式完全相同,除了本手册页中描述的差异。

如果在 pathname 中给出的路径名是相对路径,则它将相对于文件描述符 dirfd 所引用的目录进行解释(而不是相对于调用进程的当前工作目录,open(2) 对相对路径名就是这样做的)。

如果在 pathname 中给出的路径名是相对路径并且 dirfd 是特殊值 AT_FDCWD,则 pathname 将相对于调用进程的当前工作目录进行解释(就像 open(2) 一样)。

如果在 pathname 中给出的路径名是绝对路径,则忽略 dirfd

返回值

成功时,openat() 返回一个新的文件描述符。发生错误时,返回 -1 并且 errno 被设置为指示错误。

错误

open(2) 发生的相同错误也可能发生在 openat() 中。以下附加错误可能发生在 openat() 中
标签描述
EBADF dirfd 不是有效的文件描述符。
ENOTDIR
  pathname 是相对路径,并且 dirfd 是一个文件描述符,它引用的是除目录之外的文件。

备注

openat() 和其他类似的后缀为“at”的系统调用之所以受到支持有两个原因。

首先,openat() 允许应用程序避免使用 open(2) 在当前工作目录以外的目录中打开文件时可能发生的竞争条件。这些竞争条件是由以下事实导致的:在调用 open() 时,给定到 open() 的目录前缀的某些组件可能会与 open() 的调用并行更改。可以通过打开目标目录的文件描述符,然后将该文件描述符指定为 openat() 的 dirfd 参数来避免此类竞争。

其次,openat() 允许通过应用程序维护的文件描述符来实现每个线程的“当前工作目录”。(此功能也可以通过基于使用 /proc/self/fd/dirfd 的技巧来获得,但效率较低。)

符合标准

此系统调用是非标准的,但建议将其包含在 POSIX.1 的未来版本中。Solaris 上存在类似的系统调用。

版本

openat() 在 Linux 内核 2.6.16 中添加。

参见



previous next Printer Friendly

广告


  

广告



广告
© . All rights reserved.