Unix-system-calls-flock

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

[top]#

|http://www.google.com/[Google] | a|

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

選択した読書

Copyright©2014 by finddevguides

[cols=",,,,,,,",]

| |  Home   | |  References   | |  Discussion Forums   | |  About TP  

[width="100%",cols="100%",]

a| == flock()-Unix、Linuxシステムコール

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

広告

NAME

flock-開いているファイルに助言ロックを適用または削除する

概要

#include <sys/file.h> int flock(int fd, int operation);

説明

_fd_で指定された開いているファイルのアドバイザリロックを適用または削除します。 パラメーター_operation_は次のいずれかです。

Tag Description
LOCK_SH Place a shared lock. More than one process may hold a shared lock for a given file at a given time.
LOCK_EX Place an exclusive lock. Only one process may hold an exclusive lock for a given file at a given time.
LOCK_UN Remove an existing lock held by this process.

互換性のないロックが別のプロセスによって保持されている場合、 flock ()の呼び出しはブロックする場合があります。 ノンブロッキングリクエストを行うには、上記の操作のいずれかに LOCK_NBORingによる)を含めます。

1つのファイルに、共有ロックと排他ロックの両方を同時に設定することはできません。

*flock* ()によって作成されたロックは、開いているファイルテーブルエントリに関連付けられています。 これは、重複したファイル記述子(たとえば、 *fork* (2)または *dup* (2)によって作成された)が同じロックを参照し、これらの記述子のいずれかを使用してこのロックを変更または解放できることを意味します。 さらに、これらの重複した記述子のいずれかに対する明示的な *LOCK_UN* 操作によって、またはそのような記述子がすべて閉じられたときに、ロックが解放されます。

プロセスが open (2)(または同様)を使用して同じファイルの複数の記述子を取得する場合、これらの記述子は flock ()によって独立して扱われます。 これらのファイル記述子のいずれかを使用してファイルをロックしようとする試みは、呼び出しプロセスが別の記述子を介してすでに行っているロックによって拒否される場合があります。

プロセスは、ファイルに対して1つのタイプのロック(共有または排他)のみを保持できます。 すでにロックされているファイルに対する後続の flock ()呼び出しは、既存のロックを新しいロックモードに変換します。

*flock* ()によって作成されたロックは、 *execve* (2)全体にわたって保持されます。

ファイルが開かれたモードに関係なく、ファイルに共有ロックまたは排他ロックをかけることができます。

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

Error Code Description
EBADF fd is not a not an open file descriptor.
EINTR While waiting to acquire a lock, the call was interrupted by delivery of a signal caught by a handler.
EINVAL operation is invalid.
ENOLCK The kernel ran out of memory for allocating lock records.
*EWOULDBLOCK * The file is locked and the* LOCK_NB* flag was selected.

準拠

4.4BSD( flock (2)呼び出しは4.2BSDで初めて登場しました)。 fcntl (2)の観点から実装されている可能性のある flock (2)のバージョンは、ほとんどのUnicesに表示されます。

ノート

*flock* (2)は、NFS経由でファイルをロックしません。 代わりに *fcntl* (2)を使用します。これは、十分に新しいバージョンのLinuxとロックをサポートするサーバーがあれば、NFS上で動作します。

カーネル2.0以降、 flock (2)は、 fcntl (2)の呼び出しとしてGNU Cライブラリでエミュレートされるのではなく、独自のシステムコールとして実装されます。 これにより、真のBSDセマンティクスが得られます。 flock (2)と fcntl (2)によって設定されたロックのタイプ間の相互作用はなく、 flock (2)はデッドロックを検出しません。

*flock* (2)は、アドバイザリロックのみを配置します。ファイルに対する適切な許可が与えられている場合、プロセスは *flock* (2)の使用を自由に無視し、ファイルに対してI/Oを実行できます。
*flock* (2)および *fcntl* (2)ロックは、フォークされたプロセスと *dup* (2)に関して異なるセマンティクスを持ちます。 *fcntl* ()を使用して *flock* ()を実装するシステムでは、 *flock* ()のセマンティクスはこのマニュアルページで説明されているものとは異なります。

ロックの変換(共有から排他、またはその逆)はアトミックであるとは限りません。最初に既存のロックが削除され、次に新しいロックが確立されます。 これらの2つのステップの間で、別のプロセスによる保留中のロック要求が許可され、その結果、変換がブロックされるか、 LOCK_NB が指定された場合は失敗します。 (これは元のBSDの動作であり、他の多くの実装で発生します。)

関連項目

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

広告

|  

[cols="^",]

|Advertisements