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

semctl

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

semctl




書式

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

     int
     semctl(int semid, int semnum, int cmd, ...);


解説

     semctl() は、 cmd が示す操作を semid で示されるセマフォ集合に対して実行し
     ます。ある値の cmd に対しては、4 番目の引数 union semun arg が必要です。
     arg パラメータを使用するコマンドの場合、 union semun は次のように定義され
     ます。

     union semun {
             int     val;            /*  SETVAL 用の値 */
             struct  semid_ds *buf;  /*  IPC_STAT および IPC_SET 用のバッファ */
             u_short *array;         /*  GETALL および SETALL 用の配列 */
     };

     コマンドは次のように実行されます。

     IPC_STAT     セマフォ集合の struct semid_ds を取得し、 arg.buf が指すメモ
                  リに保存します。

     IPC_SET      セマフォ集合の struct semid_ds のメンバ sem_perm.uid,
                  sem_perm.gid および sem_perm.mode を、 arg.buf が指す構造体
                  のメンバと一致するように変更します。呼び出し元プロセスの実効
                  ユーザ ID は、 sem_perm.uid または sem_perm.cuid のどちらか
                  と一致する必要があるか、またはスーパユーザ特権を持っている必
                  要があります。

     IPC_RMID     セマフォ集合をただちにシステムから削除します。呼び出し元プロ
                  セスの実効ユーザ ID がセマフォ集合の sem_perm.uid または
                  sem_perm.cuid と等しいか、またはプロセスがスーパユーザ特権を
                  持っている必要があります。

     GETVAL       セマフォ番号 semnum の値を返します。

     SETVAL       セマフォ番号 semnum の値を arg.val に設定します。

     GETPID       セマフォ番号 semnum について操作を実行した最後のプロセスのプ
                  ロセス ID を返します。

     GETNCNT      セマフォ番号 semnum の値が現在の値より大きくなるのを待ってい
                  るプロセスの数を返します。

     GETZCNT      セマフォ番号 semnum の値が 0 になるのを待っているプロセスの
                  数を返します。

     GETALL       集合内のすべてのセマフォの値を arg.array が指す配列内へ取得
                                      * 1970/01/01 00:00:00 GMT
                                      * からの秒単位の経過時間
                                      */
             long    sem_pad2;       /* SVABI/386 によるとこれが必要 */
             long    sem_pad3[4];    /* SVABI/386 によるとこれが必要 */
     };


戻り値

     処理が正常に完了すると、 cmd が GETVAL, GETNCNT または GETZCNT のどれかで
     あるとき、 semctl() は対応する値を返します。そうでない場合は 0 を返しま
     す。処理に失敗した場合は、-1 を返し、エラーを示すために errno を設定しま
     す。


エラー

     semctl() は次の場合に処理に失敗します。

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

     [EINVAL]           semnum が、指定のセマフォ集合に対して有効なセマフォの
                        範囲内にありません。

     [EPERM]            呼び出し元プロセスの実効ユーザ ID が、セマフォ集合の所
                        有者または作成者のユーザ ID と一致しません。

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


関連項目

     semget(2), semop(2)

FreeBSD 4.4                   September 12, 1995                   FreeBSD 4.4

ABELNET VPSサービス