Unix-system-calls-openat

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

openat()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

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* ()に対して次の追加エラーが発生する可能性があります。

Tag

説明

*EBADF*

_dirfd_は有効なファイル記述子ではありません。

*ENOTDIR*

_pathname_は相対パスであり、_dirfd_はディレクトリ以外のファイルを参照するファイル記述子です。

ノート

*openat* ()およびサフィックス「at」が付いた他の同様のシステムコールは、2つの理由でサポートされています。

まず、 openat ()を使用すると、 open (2)を使用して現在の作業ディレクトリ以外のディレクトリにあるファイルを開くときに発生する可能性のある競合状態を回避できます。 これらの競合状態は、 open ()に指定されたディレクトリプレフィックスの一部のコンポーネントが、 open ()の呼び出しと並行して変更される可能性があるという事実に起因します。 このような競合は、ターゲットディレクトリのファイル記述子を開き、そのファイル記述子を openat ()の_dirfd_引数として指定することで回避できます。

第二に、 openat ()は、アプリケーションによって維持されるファイル記述子を介して、スレッドごとの「現在の作業ディレクトリ」の実装を許可します。 (この機能は_ proc/self/fd/ dirfdの使用に基づくトリックによっても取得できますが、効率は低下します。)

準拠

このシステムコールは非標準ですが、POSIX.1の将来のリビジョンに含めることを提案しています。 Solarisにも同様のシステムコールが存在します。

バージョン

*openat* ()は、カーネル2.6.16でLinuxに追加されました。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements