semop(2) FreeBSD 一般コマンドマニュアル

semop

前のページ 上に戻る 次のページ

semop




書式

     #include <sys/types.h>
     #include <sys/ipc.h>
     #include <sys/sem.h>

     int
     semop(int semid, struct sembuf array[], unsigned nops);


解説

     semop() は、 semid が示すセマフォ集合に対して、 array が示す操作の配列を
     不可分に実行します。 array の長さは nops で示します。各操作は struct
     sembuf 内にエンコードされており、 struct sembuf は次のように定義されま
     す。

     struct sembuf {
             u_short sem_num;        /* セマフォ番号 */
             short   sem_op;         /* セマフォ操作 */
             short   sem_flg;        /* 操作フラグ */
     };

     array 内の各要素に関し、 sem_opsem_flg は、集合内のセマフォ番号
     sem_num に対して実行される操作を決定します。指定した操作の動作を変更する
     ために、 SEM_UNDO と IPC_NOWAIT の値の論理和 ( OR ) を取って sem_flg メン
     バに入れることが可能です。

     実行される操作は次のように sem_op の値に依存します。

     o   sem_op が正の場合、セマフォの値を sem_op の値だけ増加させます。
         SEM_UNDO を指定した場合、セマフォの終了時調整値を sem_op の値だけ減少
         させます。 sem_op についての正の値は、一般に、セマフォに結び付けられ
         た資源をリリースするプロセスに対応します。

     o   sem_op が負の場合の動作は、セマフォの現在の値に依存します。

         o   セマフォの現在の値が sem_op の絶対値と等しいかそれより大きい場
             合、セマフォの値を sem_op の絶対値だけ減少させます。 SEM_UNDO が
             指定されている場合、セマフォの終了時調整値を sem_op の絶対値だけ
             増加させます。

         o   セマフォの現在値が sem_op の値未満の場合、次のどれかが発生しま
             す。

             o   IPC_NOWAIT を指定した場合、 semop() は戻り値 EAGAIN でただち
                 に復帰します。

             o   semctl() の IPC_RMID オプションを用いて、他のプロセスがセマ
                 フォを削除してしまった場合、 semop() は戻り値 EINVAL でただち
                 に復帰します。

             o   それ以外の場合、セマフォの値が sem_op の絶対値に等しいかそれ
                 より大きくなるまで、呼び出し元プロセスは休眠状態になります。

     ときには、各セマフォに対する終了時調整値がセマフォの値に追加されます。こ
     れを、プロセスが予期せず終了してしまう場合に資源を必ず解放することを保証
     するのに使用可能です。


戻り値

     関数 semop() は、処理が成功すると値 0 を返します。そうでない場合、値 -1
     が返され、グローバル変数 errno が設定されてエラーを示します。


エラー

     semop() は次の場合に失敗します。

     [EINVAL]           semid に対応するセマフォ集合がありません。

     [EACCES]           操作とセマフォ集合のモードの間で不一致があるため、パー
                        ミッションが拒否されました。

     [EAGAIN]           セマフォの値が sem_op 未満で、かつ IPC_NOWAIT が指定さ
                        れました。

     [E2BIG]            あまりに多くの操作が指定されました。

     [EFBIG]            sem_num が集合に対する有効なセマフォの範囲内にありませ
                        んでした。


関連項目

     semctl(2), semget(2)

FreeBSD 4.4                   September 22, 1995                   FreeBSD 4.4

ABELNET VPSサービス