スポンサーリンク

SEMCTL(2) FreeBSD システムコールマニュアル SEMCTL(2)

名称

semctl − セマフォ集合に対する操作を制御する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#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 が指す配列内へ取得 します。

SETALL
集合内のすべてのセマフォの値を arg.array が指す配列内の値に 設定します。あらゆるプロセス中の、この集合に属するすべてのセ マフォに対する未適用の終了時調整値は、消されます。

struct semid_ds は次のように定義されます:

struct semid_ds {
struct ipc_perm sem_perm; /* 操作パーミッション構造体 */
struct sem *sem_base; /* 集合内の最初のセマフォへのポインタ */
u_short sem_nsems; /* 集合内のセマフォの数 */
time_t sem_otime; /* 最後の操作時刻 */
long sem_pad1; /* SVABI/386 によるとこれが必要 */
time_t sem_ctime; /* 最後の変更時刻
* 1970/01/01 00:00:00 GMT
* からの秒単位の経過時間
*/
long sem_pad2; /* SVABI/386 によるとこれが必要 */
long sem_pad3[4]; /* SVABI/386 によるとこれが必要 */
};

戻り値

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

エラー

semctl() システムコールは次の場合に処理に失敗します:

       [EINVAL]

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

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

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

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

[ERANGE]
SETVAL または SETALL が、セマフォを [0 .. SEMVMX] の許 容範囲外に設定しようとしました。

関連項目

semget(2), semop(2)

バグ

SETALL は、エラーを返す前にいくつかのセマフォ要素を更新することがありま す。

FreeBSD 10.0 September 12, 1995 FreeBSD 10.0

スポンサーリンク