Unix-system-calls-futex
[top]#
[[File:]]
[[File:]] |
|Web |This Site
- 初心者向けのUnix *
- Unix-ホーム
- Unix-はじめに
- Unix-ファイル管理
- Unix-ディレクトリ
- Unix-ファイル権限
- Unix-環境
- Unix-基本ユーティリティ
- Unix-パイプとフィルタ
- Unix-プロセス
- Unix-コミュニケーション
- Unix-The Vi Editor
- Unix Shellプログラミング*
- Unix-シェルとは?
- Unix-変数の使用
- Unix-特殊変数
- Unix-配列の使用
- Unix-基本的な演算子
- Unix-意思決定
- Unix-シェルループ
- Unix-ループ制御
- Unix-シェル置換
- Unix-引用メカニズム
- Unix-IOリダイレクト
- UNIX-シェル関数
- Unix-マンページヘルプ
- 高度なUnix *
- Unix-正規表現
- Unix-ファイルシステムの基本
- Unix-ユーザー管理
- Unix-システムパフォーマンス
- Unix-システムログ
- Unix-信号とトラップ
- Unixの便利なリファレンス*
- Unix-便利なコマンド
- Unix-クイックガイド
- Unix-組み込み関数
- Unix-システムコール
- Unix-コマンドリスト
- Unixの役立つリソース*
- Unix役立つリソース
選択した読書
- http://www.finddevguides.com/computer_glossary [コンピュータ用語集] *http://www.finddevguides.com/computer_whoiswho[Who is Who]
Copyright©2014 by finddevguides
Home | References | Discussion Forums | About TP |
futex()-Unix、Linuxシステムコール
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]
広告
NAME
futex-高速ユーザースペースロックシステムコール
概要
#include <linux/futex.h> #include <sys/time.h> int futex(int* uaddr, int op, int val, const struct timespec *timeout , int* uaddr2, int val3); |
説明
この関数の呼び出し元は、 futex (7)に記載されているセマンティクスに従うことが期待されています。 これらのセマンティクスには移植性のないアセンブリ命令の記述が含まれるため、これはおそらくほとんどのユーザーが実際にはライブラリ作成者であり、一般的なアプリケーション開発者ではないことを意味します。
_uaddr_引数は、カウンターを格納する整列された整数を指す必要があります。 実行する操作は、値_val_とともに、_op_パラメーターを介して渡されます。
現在、5つの操作が定義されています。
Tag
説明
この操作は、futexアドレス_uaddr_に値_val_がまだ含まれていることを原子的に検証し、このfutexアドレスでFUTEX_WAKEを待機してスリープします。 _timeout_引数がNULL以外の場合、その内容は待機の最大期間を示し、それ以外の場合は無限です。 引数_uaddr2_および_val3_は無視されます。
この操作は、このfutexアドレスで待機している_val_プロセスを最大で起動します(つまり、 FUTEX_WAIT内)。 引数_timeout 、 uaddr2_、および_val3_は無視されます。
非同期ウェイクアップをサポートするために、この操作はファイル記述子をfutexに関連付けます。 別のプロセスがFUTEX_WAKEを実行すると、プロセスは_val_で渡されたシグナル番号を受け取ります。 呼び出しプロセスは、使用後に返されたファイル記述子を閉じる必要があります。 引数_timeout 、 uaddr2_、および_val3_は無視されます。
競合状態を防ぐために、呼び出し元は、FUTEX_FDが戻った後にfutexがアップしたかどうかをテストする必要があります。
この操作は、FUTEX_WAKEが使用され、起動されたすべてのプロセスが別のfutexを取得する必要がある場合に、「雷鳴の群れ」効果を回避するために導入されました。 この呼び出しは、_val_プロセスを起動し、アドレス_uaddr2_のfutex上の他のすべての待機者をキューに再配置します。 引数_timeout_および_val3_は無視されます。
FUTEX_REQUEUEの使用目的に競合があったため、FUTEX_CMP_REQUEUEが導入されました。 これはFUTEX_REQUEUEに似ていますが、最初に場所_uaddr_に値_val3_がまだ含まれているかどうかを確認します。 そうでない場合、エラーEAGAINが返されます。 引数_timeout_は無視されます。
返り値
実行された操作に応じて、返される値の意味は異なります。
Tag | Description |
---|---|
FUTEX_WAIT | Returns 0 if the process was woken by a FUTEX_WAKE call. In case of timeout, ETIMEDOUT is returned. If the futex was not equal to the expected value, the operation returns EWOULDBLOCK. Signals (or other spurious wakeups) cause FUTEX_WAIT to return EINTR. |
FUTEX_WAKE | Returns the number of processes woken up. |
FUTEX_FD | Returns the new file descriptor associated with the futex. |
FUTEX_REQUEUE | Returns the number of processes woken up. |
FUTEX_CMP_REQUEUE | Returns the number of processes woken up. |
エラー
Error Code | Description |
---|---|
EACCES | No read access to futex memory. |
EAGAIN | FUTEX_CMP_REQUEUE found an unexpected futex value. (This probably indicates a race; use the safe FUTEX_WAKE now.) |
EFAULT | Error in getting timeout information from userspace. |
EINVAL | An operation was not defined or error in page alignment. |
ENFILE | The system limit on the total number of open files has been reached. |
ノート
繰り返しますが、裸のfutexは、エンドユーザーにとって使いやすい抽象化を意図したものではありません。 実装者は、アセンブリの知識があり、以下で参照されるfutexユーザー空間ライブラリのソースを読んでいることが期待されます。
バージョン
最初のfutexサポートはLinux 2.5.7に統合されましたが、上記とは異なるセマンティクスを備えています。 ここに示したセマンティクスを使用した4パラメーターシステムコールは、Linux 2.5.40で導入されました。 Linux 2.5.70では、1つのパラメーターが追加されました。 Linux 2.6.7では、6番目のパラメーターが追加されました。特にs390アーキテクチャでは厄介です。
準拠
このシステムコールはMinux固有です。
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]
広告
Advertisements |