X-Git-Url: http://git.osdn.net/view?p=linuxjm%2FLDP_man-pages.git;a=blobdiff_plain;f=release%2Fman2%2Fsemop.2;h=4c8cbbbcb985f7038232a5b24110bb86475790ea;hp=507b1d3ed27fde9343c0ee05c74c5280e881601c;hb=refs%2Ftags%2FLDP-3.39-final;hpb=f8a251df75590049b7aa6f3cd698b6ce733b1ea5 diff --git a/release/man2/semop.2 b/release/man2/semop.2 index 507b1d3e..4c8cbbbc 100644 --- a/release/man2/semop.2 +++ b/release/man2/semop.2 @@ -30,58 +30,33 @@ .\" 2005-04-08, mtk, Noted kernel version numbers for semtimedop() .\" 2007-07-09, mtk, Added an EXAMPLE code segment. .\" -.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya -.\" all rights reserved. -.\" Translated 1997-02-23, HANATAKA Shinya -.\" Updated 2003-02-09, Kentaro Shirakata -.\" Updated 2003-09-12, Kentaro Shirakata -.\" Updated 2005-03-01, Akihiro MOTOKI -.\" Updated 2005-04-17, Akihiro MOTOKI -.\" Updated 2005-09-06, Akihiro MOTOKI -.\" Updated 2007-05-01, Akihiro MOTOKI, LDP v2.46 +.\"******************************************************************* .\" -.\"WORD: semaphore セマフォ -.\"WORD: member メンバー -.\"WORD: process プロセス -.\"WORD: system call システムコール -.\"WORD: undo アンドゥ -.\"WORD: signal シグナル -.\"WORD: catch 捕獲(catch) -.\"WORD: process-ID プロセスID -.\"WORD: policy 方針 -.\"WORD: implement 実装 -.\"WORD: queue キュー -.\"WORD: free 解放(free). -.\"WORD: memory メモリ -.\"WORD: anonymous structure 無名構造体 -.\"WORD: time limit 制限時間 -\" -.TH SEMOP 2 2008-10-04 "Linux" "Linux Programmer's Manual" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.TH SEMOP 2 2008\-10\-04 Linux "Linux Programmer's Manual" .SH 名前 semop, semtimedop \- セマフォの操作 .SH 書式 .nf -.B #include -.B #include -.B #include +\fB#include \fP +\fB#include \fP +\fB#include \fP .sp -.BI "int semop(int " semid ", struct sembuf *" sops ", unsigned " nsops ); +\fBint semop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, unsigned \fP\fInsops\fP\fB);\fP .sp -.BI "int semtimedop(int " semid ", struct sembuf *" sops ", unsigned " nsops , -.BI " struct timespec *" timeout ); +\fBint semtimedop(int \fP\fIsemid\fP\fB, struct sembuf *\fP\fIsops\fP\fB, unsigned \fP\fInsops\fP\fB,\fP +\fB struct timespec *\fP\fItimeout\fP\fB);\fP .fi .sp .in -4n -glibc 向けの機能検査マクロの要件 -.RB ( feature_test_macros (7) -参照): +glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .in .sp -.BR semtimedop (): -_GNU_SOURCE +\fBsemtimedop\fP(): _GNU_SOURCE .SH 説明 -セマフォ集合 (semaphore set) のメンバーの各セマフォは -以下の関連情報を持っている: +セマフォ集合 (semaphore set) のメンバーの各セマフォは 以下の関連情報を持っている: .sp .in +4n .nf @@ -92,17 +67,8 @@ pid_t sempid; /* 最後に操作を行なったプロセス */ .sp .in -4n .fi -.BR semop () -は -.I semid -で指定されたセマフォ集合の選択されたセマフォに対して操作を行う。 -.I sops -は -.I nsops -個の要素の配列を指し、配列の各要素は個々のセマフォに -対する操作を示す。その型は -.I struct sembuf -で、次のメンバを持つ: +\fBsemop\fP() は \fIsemid\fP で指定されたセマフォ集合の選択されたセマフォに対して操作を行う。 \fIsops\fP は \fInsops\fP +個の要素の配列を指し、配列の各要素は個々のセマフォに 対する操作を示す。その型は \fIstruct sembuf\fP で、次のメンバを持つ: .sp .in +4n .nf @@ -112,413 +78,152 @@ short sem_flg; /* 操作フラグ */ .sp .in -4n .fi -.I sem_flg -には -.B IPC_NOWAIT -と -.B SEM_UNDO -が設定できる。 -.B SEM_UNDO +\fIsem_flg\fP には \fBIPC_NOWAIT\fP と \fBSEM_UNDO\fP が設定できる。 \fBSEM_UNDO\fP が指定された操作は、そのプロセスが終了した時に自動的に取り消される。 .PP -.I sops -に含まれる操作の集合は、 -.I "配列の順序" -で、 -.I アトミックに -実行される。 -すなわち、全ての操作が完全に実行されるか、全く実行されないかの -どちらかとなる。 - -全ての操作が直ちに実行できない場合のこのシステムコールの振る舞いは -個々の操作の -.I sem_flg -フィールドに -.B IPC_NOWAIT -が存在するかによって決まり、後述のようになる。 +\fIsops\fP に含まれる操作の集合は、 \fI配列の順序\fP で、 \fIアトミックに\fP 実行される。 +すなわち、全ての操作が完全に実行されるか、全く実行されないかの どちらかとなる。 全ての操作が直ちに実行できない場合のこのシステムコールの振る舞いは +個々の操作の \fIsem_flg\fP フィールドに \fBIPC_NOWAIT\fP が存在するかによって決まり、後述のようになる。 -それぞれの操作はセマフォ集合の -.IR sem_num 番目 -のセマフォに対して実行される。セマフォ集合の最初のセマフォには -番号 0 が振られる。 -そして操作は三種類あり、 -.I sem_op -の値で区別される。 +それぞれの操作はセマフォ集合の \fIsem_num\fP番目 のセマフォに対して実行される。セマフォ集合の最初のセマフォには 番号 0 が振られる。 +そして操作は三種類あり、 \fIsem_op\fP の値で区別される。 .PP -.I sem_op -が正の整数の場合、操作としてその値をセマフォの値 -.RI ( semval ) -に加える。さらにこの操作に -.B SEM_UNDO -が指定されている場合は、システムはこのセマフォの プロセス・アンドゥ数 -.RI ( semadj ) -を更新する。 -この操作は必ず実行でき、プロセスの停止は起こらない。 -呼び出し元プロセスは対象のセマフォ集合を変更する許可がなければならない。 +\fIsem_op\fP が正の整数の場合、操作としてその値をセマフォの値 (\fIsemval\fP) に加える。さらにこの操作に \fBSEM_UNDO\fP +が指定されている場合は、システムはこのセマフォの プロセス・アンドゥ数 (\fIsemadj\fP) を更新する。 +この操作は必ず実行でき、プロセスの停止は起こらない。 呼び出し元プロセスは対象のセマフォ集合を変更する許可がなければならない。 .PP -.I sem_op -が 0 の場合、「ゼロまで待つ」操作である。この場合、プロセスは -そのセマフォ集合に対する読み込み許可がなければならない。 -.I semval -が 0 ならば、操作は直ちに行われる。 -.I semval -が 0 でない場合、 -.I sem_flg -に -.B IPC_NOWAIT -が指定されていれば、 -.BR semop () -は失敗し、 -.B errno -に -.B EAGAIN -が設定される (このとき -.I sops -に対する操作は全く実行されない)。 -.I sem_flg -に -.B IPC_NOWAIT -が指定されていない場合、 -.I semzcnt -(セマフォ値が 0 になるのを待っているプロセスの数) を 1 増加させて、 -以下のいずれかが起こるまでプロセスを停止 (sleep) する。 +\fIsem_op\fP が 0 の場合、「ゼロまで待つ」操作である。この場合、プロセスは そのセマフォ集合に対する読み込み許可がなければならない。 +\fIsemval\fP が 0 ならば、操作は直ちに行われる。 \fIsemval\fP が 0 でない場合、 \fIsem_flg\fP に +\fBIPC_NOWAIT\fP が指定されていれば、 \fBsemop\fP() は失敗し、 \fBerrno\fP に \fBEAGAIN\fP が設定される (このとき +\fIsops\fP に対する操作は全く実行されない)。 \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定されていない場合、 \fIsemzcnt\fP +(セマフォ値が 0 になるのを待っているプロセスの数) を 1 増加させて、 以下のいずれかが起こるまでプロセスを停止 (sleep) する。 .IP \(bu 3 -.I semval -が 0 になった: このとき -.I semzcnt -の値は 1 減算される。 +\fIsemval\fP が 0 になった: このとき \fIsemzcnt\fP の値は 1 減算される。 .IP \(bu -セマフォ集合が削除された: このとき -.BR semop () -は失敗し、 -.I errno -に -.B EIDRM -が設定される。 +セマフォ集合が削除された: このとき \fBsemop\fP() は失敗し、 \fIerrno\fP に \fBEIDRM\fP が設定される。 .IP \(bu -呼び出し元プロセスがシグナルを捕獲した: このとき -.I semzcnt -の値は 1 減算され、 -.BR semop () -は失敗し -.I errno -に -.B EINTR -が設定される。 +呼び出し元プロセスがシグナルを捕獲した: このとき \fIsemzcnt\fP の値は 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に +\fBEINTR\fP が設定される。 .IP \(bu -.\" motoki: semop () は semtimedop () の間違い? -.BR semtimedop () -の -.I timeout -で指定された制限時間が経過した: このとき -.BR semtimedop () -は失敗し、 -.I errno -に -.B EAGAIN -が設定される。 +\fBsemtimedop\fP() の \fItimeout\fP で指定された制限時間が経過した: このとき \fBsemtimedop\fP() は失敗し、 +\fIerrno\fP に \fBEAGAIN\fP が設定される。 .PP -.I sem_op -が 0 未満の場合、プロセスにはそのセマフォ集合を変更する許可がなければ -ならない。 -.I semval -が -.I sem_op -の絶対値以上の場合は、操作は直ちに実行される: -.I semval -から -.I sem_op -の絶対値が減算される。 -さらに、この操作に -.B SEM_UNDO -が指定されている場合は、このセマフォのプロセス・アンドゥ数 -.RI ( semadj ) -を更新する。 -.I semval -が -.I sem_op -の絶対値より小さく、 -.I sem_flg -に -.B IPC_NOWAIT -が指定された場合は、 -.BR semop () -は失敗し、 -.I errno -に -.B EAGAIN -が設定される (このとき -.I sops -の操作は全く実行されない)。 -.B IPC_WAIT -が指定されていなければ、 -.I semncnt -(このセマフォの値が増加するのを待っているプロセス数のカウンタ) -を 1 増加させて、以下のいずれかが起こるまでプロセスを停止 (sleep) する。 +\fIsem_op\fP が 0 未満の場合、プロセスにはそのセマフォ集合を変更する許可がなければ ならない。 \fIsemval\fP が \fIsem_op\fP +の絶対値以上の場合は、操作は直ちに実行される: \fIsemval\fP から \fIsem_op\fP の絶対値が減算される。 さらに、この操作に +\fBSEM_UNDO\fP が指定されている場合は、このセマフォのプロセス・アンドゥ数 (\fIsemadj\fP) を更新する。 \fIsemval\fP が +\fIsem_op\fP の絶対値より小さく、 \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定された場合は、 \fBsemop\fP() は失敗し、 +\fIerrno\fP に \fBEAGAIN\fP が設定される (このとき \fIsops\fP の操作は全く実行されない)。 \fBIPC_WAIT\fP +が指定されていなければ、 \fIsemncnt\fP (このセマフォの値が増加するのを待っているプロセス数のカウンタ) を 1 +増加させて、以下のいずれかが起こるまでプロセスを停止 (sleep) する。 .IP \(bu 3 -.I semval -が -.I sem_op -の絶対値以上になった: このとき -.I semncnt -が 1 減算され、 -.I semval -から -.I sem_op -の絶対値が引かれる。 -この操作に -.B SEM_UNDO -が指定されていた場合にはこのセマフォのプロセス・アンドゥ数 -.RI ( semadj ) -も更新する。 +\fIsemval\fP が \fIsem_op\fP の絶対値以上になった: このとき \fIsemncnt\fP が 1 減算され、 \fIsemval\fP から +\fIsem_op\fP の絶対値が引かれる。 この操作に \fBSEM_UNDO\fP が指定されていた場合にはこのセマフォのプロセス・アンドゥ数 +(\fIsemadj\fP) も更新する。 .IP \(bu -セマフォ集合がシステムから削除された: このとき -.BR semop () -は失敗し -.I errno -に -.B EIDRM -が設定される。 +セマフォ集合がシステムから削除された: このとき \fBsemop\fP() は失敗し \fIerrno\fP に \fBEIDRM\fP が設定される。 .IP \(bu -呼び出したプロセスがシグナルを捕獲した: このとき -.I semncnt -が 1 減算され、 -.BR semop () -は失敗し -.I errno -に -.B EINTR -が設定される。 +呼び出したプロセスがシグナルを捕獲した: このとき \fIsemncnt\fP が 1 減算され、 \fBsemop\fP() は失敗し \fIerrno\fP に +\fBEINTR\fP が設定される。 .IP \(bu -.\" motoki: the system call は semtimedop () のこと? -.BR semtimedop () -の -.I timeout -で指定された制限時間が経過した: このとき -.BR semtimedop () -は失敗し、 -.I errno -に -.B EAGAIN -が設定される。 +\fBsemtimedop\fP() の \fItimeout\fP で指定された制限時間が経過した: このとき \fBsemtimedop\fP() は失敗し、 +\fIerrno\fP に \fBEAGAIN\fP が設定される。 .PP -操作が成功した場合、 -.I sops -が指す配列によって操作対象となった各セマフォの -.I sempid -メンバーには呼び出したプロセスのプロセス ID が設定される。 -さらに -.I sem_otime -.\" と +.\" and .\" .I sem_ctime -に現在時刻が設定される。 +操作が成功した場合、 \fIsops\fP が指す配列によって操作対象となった各セマフォの \fIsempid\fP メンバーには呼び出したプロセスのプロセス ID +が設定される。 さらに \fIsem_otime\fP に現在時刻が設定される。 .PP -.BR semtimedop () -関数の振る舞いは -.BR semop () -と全く同じだが、 -呼び出し元プロセスが停止する場合、停止期間の上限が -.I timeout -引き数の指す -.I timespec -構造体で指定された時間となる点だけが異なる。 -指定した制限時間に達した場合は、 -.BR semtimedop () -は失敗し、 -.I errno -に -.B EAGAIN -が設定される -(このとき -.I sops -の操作は実行されない)。 -.I timeout -引き数が NULL の場合、 -.BR semtimedop () -関数の振る舞いは -.BR semop () +\fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP() と全く同じだが、 呼び出し元プロセスが停止する場合、停止期間の上限が +\fItimeout\fP 引き数の指す \fItimespec\fP 構造体で指定された時間となる点だけが異なる。 指定した制限時間に達した場合は、 +\fBsemtimedop\fP() は失敗し、 \fIerrno\fP に \fBEAGAIN\fP が設定される (このとき \fIsops\fP +の操作は実行されない)。 \fItimeout\fP 引き数が NULL の場合、 \fBsemtimedop\fP() 関数の振る舞いは \fBsemop\fP() 関数と全く同じになる。 .SH 返り値 -成功した場合、 -.BR semop () -と -.BR semtimedop () -は 0 を返す。そうでなければ \-1 を返し、 -エラーを示す -.I errno -を設定する。 +成功した場合、 \fBsemop\fP() と \fBsemtimedop\fP() は 0 を返す。そうでなければ \-1 を返し、 エラーを示す +\fIerrno\fP を設定する。 .SH エラー -失敗した場合、 -.I errno -に以下のどれかが設定される: -.TP -.B E2BIG -.I nsops -引き数が -.B SEMOPM -より大きい。 -.B SEMOPM -は一回のシステムコールで許される操作の最大個数である。 -.TP -.B EACCES -呼び出し元プロセスには指定されたセマフォ操作を行うのに -必要なアクセス許可がなく、 -.B CAP_IPC_OWNER -ケーパビリティもない。 -.TP -.B EAGAIN -操作を直ちに処理することができず、かつ -.I sem_flg -に -.B IPC_NOWAIT -が指定されているか -.I timeout +失敗した場合、 \fIerrno\fP に以下のどれかが設定される: +.TP +\fBE2BIG\fP +\fInsops\fP 引き数が \fBSEMOPM\fP より大きい。 \fBSEMOPM\fP は一回のシステムコールで許される操作の最大個数である。 +.TP +\fBEACCES\fP +呼び出し元プロセスには指定されたセマフォ操作を行うのに 必要なアクセス許可がなく、 \fBCAP_IPC_OWNER\fP ケーパビリティもない。 +.TP +\fBEAGAIN\fP +操作を直ちに処理することができず、かつ \fIsem_flg\fP に \fBIPC_NOWAIT\fP が指定されているか \fItimeout\fP で指定された制限時間が経過した。 -.TP -.B EFAULT -引き数 -.I sops -か -.I timeout -が指しているアドレスにアクセスできない。 -.TP -.B EFBIG -ある操作で、 -.I sem_num -の値が 0 未満か、集合内のセマフォの数以上である。 -.TP -.B EIDRM +.TP +\fBEFAULT\fP +引き数 \fIsops\fP か \fItimeout\fP が指しているアドレスにアクセスできない。 +.TP +\fBEFBIG\fP +ある操作で、 \fIsem_num\fP の値が 0 未満か、集合内のセマフォの数以上である。 +.TP +\fBEIDRM\fP セマフォ集合が削除された。 -.TP -.B EINTR -このシステムコールで停止している時にプロセスがシグナルを捕獲した。 -.BR single (7) -参照。 -.TP -.B EINVAL -セマフォ集合が存在しないか、 -.I semid -が 0 未満であるか、 -.I nsops -が正の数でない。 -.TP -.B ENOMEM -ある操作で -.I sem_flg -に -.B SEM_UNDO -が指定されたが、システムにアンドゥ構造体に割り当てる十分なメモリがない。 -.TP -.B ERANGE -ある操作で -.I sem_op+semval -が -.B SEMVMX -より大きい。 -.B SEMVMX -は -.I semval +.TP +\fBEINTR\fP +このシステムコールで停止している時にプロセスがシグナルを捕獲した。 \fBsingle\fP(7) 参照。 +.TP +\fBEINVAL\fP +セマフォ集合が存在しないか、 \fIsemid\fP が 0 未満であるか、 \fInsops\fP が正の数でない。 +.TP +\fBENOMEM\fP +ある操作で \fIsem_flg\fP に \fBSEM_UNDO\fP が指定されたが、システムにアンドゥ構造体に割り当てる十分なメモリがない。 +.TP +\fBERANGE\fP +ある操作で \fIsem_op+semval\fP が \fBSEMVMX\fP より大きい。 \fBSEMVMX\fP は \fIsemval\fP の最大値で、その値は実装依存である。 .SH バージョン -.BR semtimedop () -は Linux 2.5.52 で初めて登場し、 -それからカーネル 2.4.22 にも移植された。 -.BR semtimedop () -の glibc でのサポートはバージョン 2.3.3 で初めて登場した。 +\fBsemtimedop\fP() は Linux 2.5.52 で初めて登場し、 それからカーネル 2.4.22 にも移植された。 +\fBsemtimedop\fP() の glibc でのサポートはバージョン 2.3.3 で初めて登場した。 .SH 準拠 -SVr4, POSIX.1-2001. -.\" SVr4 には、追加で EINVAL, EFBIG, ENOSPC のエラー状態についての -.\" 記述がある。 +.\" SVr4 documents additional error conditions EINVAL, EFBIG, ENOSPC. +SVr4, POSIX.1\-2001. .SH 注意 -あるプロセスの -.I sem_undo -構造体は -.BR fork (2) -で生成された子プロセスには継承されないが、 -.BR execve (2) +あるプロセスの \fIsem_undo\fP 構造体は \fBfork\fP(2) で生成された子プロセスには継承されないが、 \fBexecve\fP(2) システムコールの場合は継承される。 .PP -.BR semop () -はシグナルハンドラによって中断された後に、 -決して自動的に再開することはない。 -たとえシグナルハンドラの設定時に -.B SA_RESTART -フラグがセットされていても再開することはない +\fBsemop\fP() はシグナルハンドラによって中断された後に、 決して自動的に再開することはない。 たとえシグナルハンドラの設定時に +\fBSA_RESTART\fP フラグがセットされていても再開することはない .PP -.I semadj -はプロセスごとの整数で、 -.B SEM_UNDO -フラグを設定して実行された全てのセマフォ操作の(負数の)カウンタである。 -.BR semctl (2) -に -.B SETVAL -または -.B SETALL -を指定し、セマフォの値が -直接設定された場合には、全てのプロセスにおいて対応する -.I semadj -の値がクリアされる。 +\fIsemadj\fP はプロセスごとの整数で、 \fBSEM_UNDO\fP フラグを設定して実行された全てのセマフォ操作の(負数の)カウンタである。 +\fBsemctl\fP(2) に \fBSETVAL\fP または \fBSETALL\fP を指定し、セマフォの値が +直接設定された場合には、全てのプロセスにおいて対応する \fIsemadj\fP の値がクリアされる。 .PP -あるセマフォの \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP -の値はいずれも、適切な操作を指定して -.BR semctl (2) -を呼び出すことで取得できる。 +あるセマフォの \fIsemval\fP, \fIsempid\fP, \fIsemzcnt\fP, \fIsemnct\fP の値はいずれも、適切な操作を指定して +\fBsemctl\fP(2) を呼び出すことで取得できる。 .PP -セマフォ集合のリソースに関する制限のうち、 -.BR semop () -に影響を及ぼすものを以下に挙げる: -.TP -.B SEMOPM -一回の -.BR semop () -で許される操作の最大数 (32)。 -(Linux では、この制限値は -.I /proc/sys/kernel/sem +セマフォ集合のリソースに関する制限のうち、 \fBsemop\fP() に影響を及ぼすものを以下に挙げる: +.TP +\fBSEMOPM\fP +.\" This /proc file is not available in Linux 2.2 and earlier -- MTK +一回の \fBsemop\fP() で許される操作の最大数 (32)。 (Linux では、この制限値は \fI/proc/sys/kernel/sem\fP の第3フィールドに対応し、読み出しも変更もできる)。 -.\" この /proc ファイルは Linux 2.2 以前では利用できない -- MTK -.TP -.B SEMVMX -.I semval -が取り得る最大値: 実装依存 (32767)。 +.TP +\fBSEMVMX\fP +\fIsemval\fP が取り得る最大値: 実装依存 (32767)。 .PP -以下の値に関しては実装依存の制限はない。 -終了時の調整 (adjust on exit) の最大値 -.RB ( SEMAEM )、 -システム全体のアンドゥ構造体の最大数 -.RB ( SEMMNU )、 -プロセスあたりのアンドゥ構造体の最大数。 +以下の値に関しては実装依存の制限はない。 終了時の調整 (adjust on exit) の最大値 (\fBSEMAEM\fP)、 +システム全体のアンドゥ構造体の最大数 (\fBSEMMNU\fP)、 プロセスあたりのアンドゥ構造体の最大数。 .SH バグ -プロセスが終了する際、プロセスに対応する -.I semadj -の集合を使って、 -.B SEM_UNDO -フラグ付きで実行された全てのセマフォ操作の影響を取り消す。 -これによりある問題が発生する: これらのセマフォの調整を行っていると、 -中にはセマフォの値が 0 未満の値にしようとする場合が出てくる。 -このような場合、どのように実装するべきか? -ひとつの考えられる手法は、全てのセマフォ調整が実行されるまで -停止することである。しかし、この方法ではプロセスの終了が -長時間にわたって停止されることがあるので望ましくない。 -しかもどれくらい長時間になるかは分からない。 -別の選択肢として、このようなセマフォ調整を完全に無視してしまう方法がある -(これはセマフォ操作として -.B IPC_NOWAIT -が指定するのと少し似ている)。 -Linux は第三の手法を採用している: セマフォの値を出来るだけ (つまり -0 まで) 減少させて、プロセスの終了を直ちに続行できるようにしている。 +プロセスが終了する際、プロセスに対応する \fIsemadj\fP の集合を使って、 \fBSEM_UNDO\fP +フラグ付きで実行された全てのセマフォ操作の影響を取り消す。 これによりある問題が発生する: これらのセマフォの調整を行っていると、 中にはセマフォの値が +0 未満の値にしようとする場合が出てくる。 このような場合、どのように実装するべきか? ひとつの考えられる手法は、全てのセマフォ調整が実行されるまで +停止することである。しかし、この方法ではプロセスの終了が 長時間にわたって停止されることがあるので望ましくない。 +しかもどれくらい長時間になるかは分からない。 別の選択肢として、このようなセマフォ調整を完全に無視してしまう方法がある (これはセマフォ操作として +\fBIPC_NOWAIT\fP が指定するのと少し似ている)。 Linux は第三の手法を採用している: セマフォの値を出来るだけ (つまり 0 まで) +減少させて、プロセスの終了を直ちに続行できるようにしている。 -カーネル 2.6.x (x <= 10) には、ある状況においてセマフォ値が 0 になるのを -待っているプロセスが、セマフォ値が実際に 0 になったときに起床 (wake up) -されない、というバグがある。このバグはカーネル 2.6.11 で修正されている。 -.\" バグレポート: +.\" The bug report: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110260821123863&w=2 -.\" 修正: +.\" the fix: .\" http://marc.theaimsgroup.com/?l=linux-kernel&m=110261701025794&w=2 +カーネル 2.6.x (x <= 10) には、ある状況においてセマフォ値が 0 になるのを 待っているプロセスが、セマフォ値が実際に 0 +になったときに起床 (wake up) されない、というバグがある。このバグはカーネル 2.6.11 で修正されている。 .SH 例 -以下の部分的なコードは、 -セマフォ 0 の値が 0 になるのを待ってから、 -セマフォの値を 1 加算する処理を、 -.BR semop () +以下の部分的なコードは、 セマフォ 0 の値が 0 になるのを待ってから、 セマフォの値を 1 加算する処理を、 \fBsemop\fP() を使ってアトミック (atomically) に行う。 .nf @@ -541,10 +246,5 @@ Linux は第三の手法を採用している: セマフォの値を出来るだ } .fi .SH 関連項目 -.BR semctl (2), -.BR semget (2), -.BR sigaction (2), -.BR capabilities (7), -.BR sem_overview (7), -.BR svipc (7), -.BR time (7) +\fBsemctl\fP(2), \fBsemget\fP(2), \fBsigaction\fP(2), \fBcapabilities\fP(7), +\fBsem_overview\fP(7), \fBsvipc\fP(7), \fBtime\fP(7)