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

廣告


  

廣告



廣告