semctlのヘルプ・マニュアル
日本語 英語
semctl --help
man semctl
SEMCTL(2) Linux Programmer’s Manual SEMCTL(2)
名前
semctl - セマフォの制御操作を行なう
書式
#include
#include
#include
int semctl(int semid, int semnum, int cmd, ...);
説明
semctl() は、 semid で指定されたセマフォ集合 (semaphore set) またはセマ
フォ集合の semnun 番目のセマフォに対して、 cmd で指定された制御操作を行
なう (集合内のセマフォの番号は 0 から始まる)。
こ の関数は、 cmd の値に依存して、3 個または 4 個の引き数を持つ。引き数
が 4 個の場合、第 4 引き数の型は union semun である。呼び出し元プログラ
ムは、この共用体 (union) を以下のように定義しなければならない。
union semun {
int val; /* SETVAL の値 */
struct semid_ds *buf; /* IPC_STAT, IPC_SET 用のバッファ */
unsigned short *array; /* GETALL, SETALL 用の配列 */
struct seminfo *__buf; /* IPC_INFO 用のバッファ
(Linux 固有) */
};
semid_ds データ構造体は で以下のように定義されている:
struct semid_ds {
struct ipc_perm sem_perm; /* 所有権と許可 */
time_t sem_otime; /* 最後の semop の時刻 */
time_t sem_ctime; /* 最後に変更が行われた時刻 */
unsigned short sem_nsems; /* 集合内のセマフォの数 */
};
ipc_perm 構造体は で以下のように定義されている (強調された
フィールドは IPC_SET を使って設定可能である):
struct ipc_perm {
key_t __key; /* semget(2) に与えられるキー */
uid_t uid; /* 所有者 (owner) の実効 UID */
gid_t gid; /* 所有者の実効 GID */
uid_t cuid; /* 作成者 (creator) の実効 UID */
gid_t cgid; /* 作成者の実効 GID */
unsigned short mode; /* 許可 */
unsigned short __seq; /* シーケンス番号 */
};
cmd として有効な値は
IPC_STAT semid に関連づけられたカーネルデータ構造体の情報を arg.buf で
指 された semid_ds 構造体へコピーする。 semnum 引き数は無視さ
れる。呼び出したプロセスはそのセマフォ集合に対する読み込み 許
可を持たなければならない。
IPC_SET arg.buf で指定された semid_ds 構造体のメンバーのいくつかの値
を、このセマフォに関連づけられたカーネルデータ構造体に書き 込
み、 sem_ctime メンバーの値も更新する。構造体の以下のメンバー
が更新される: sem_perm.uid, sem_perm.gid, sem_perm.mode (の最
下 位 9 ビ ッ ト) 。 呼び出したプロセスの実効 UID が所有者
(sem_perm.uid) または作成者 (sem_perm.cuid) と一致するか、 呼
び 出した人が特権を持たなければならない。 semnum 引き数は無視
される。
IPC_RMID セマフォ集合をただちに削除し、その集合上の semop(2) コール で
ブ ロックされている全てのプロセスを目覚めさせる (エラー値が返
されて、 errno に EIDRM が設定される)。呼び出したプロセスの実
効 ユーザ ID がそのセマフォ集合の作成者または所有者と一致する
か、呼び出した人が特権を持たなければならない。 semnum 引き 数
は無視される。
IPC_INFO (Linux 固有)
シ ス テ ム全体でのセマフォの制限とパラメータに関する情報を、
arg.__buf が指す構造体に入れて返す。この構造体は seminfo 型で
あ る。 seminfo は _GNU_SOURCE 機能検査マクロが定義された場合
に で以下のように定義される:
struct seminfo {
int semmap; /* セマフォ・マップの最大エントリ数;
カーネル内では未使用 */
int semmni; /* セマフォ集合の最大数 */
int semmns; /* 全セマフォ集合中のセマフォの
最大数 */
int semmnu; /* アンドゥ構造体のシステム全体での
最大数; カーネル内では未使用 */
int semmsl; /* 一つのセマフォ集合の最大セマフォ数 */
int semopm; /* semop(2) に渡す操作の最大数 */
int semume; /* プロセスあたりのアンドゥ・エントリ
の最大数; カーネル内では未使用 */
int semusz; /* 構造体 sem_undo のサイズ */
int semvmx; /* セマフォの最大値 */
int semaem; /* セマフォの調整 (semaphore adjustment;
SEM_UNDO) のために記録される最大値 */
};
設定 semmsl, semmns, semopm, semmni は /proc/sys/kernel/sem
経由で変更可能である。詳しくは proc(5) を参照。
SEM_INFO (Linux 固有)
IPC_INFO のときと同じ情報を格納した seminfo 構造体を返す。但
し、以下のフィールドにはセマフォが消費しているシステム資源 に
関 する情報が格納される点が異なる。 semusz フィールドは現在シ
ステム上に存在するセマフォ集合の数を返す。 semaem フィール ド
は システム上の全てのセマフォ集合に含まれるセマフォの総数を返
す。
SEM_STAT (Linux 固有)
IPC_STAT と同じく semid_ds 構造体を返す。但し、 semid 引き 数
は 、セマフォ識別子ではなく、システム上の全てのセマフォ集合に
関する情報を管理するカーネルの内部配列へのインデックスであ る
。
GETALL 集合の全てのセマフォの semval の値 (現在の値) を arg.array に
返す。 semnum 引き数は無視される。呼び出したプロセスはその セ
マフォ集合に読み込み許可を持たなければならない。
GETNCNT システムコールは集合の semnum 番目のセマフォの semncnt の値 (
このセマフォの値が増加するのを待っているプロセス数) を返す (
集 合の semnum 番目のセマフォの semval の増加を待っているプロ
セスの数を返す)。呼び出したプロセスはそのセマフォ集合に読み込
み許可を持たなければならない。
GETPID システムコールは集合の semnum 番目のセマフォの sempid の値 (
集合の semnum 番目のセマフォに最後に semop(2) コールを実行 し
た プロセスの PID) を返す。呼び出したプロセスはそのセマフォ集
合に読み込み許可を持たなければならない。
GETVAL システムコールは集合の semnum 番目のセマフォの semval の値 を
返 す。呼び出したプロセスはそのセマフォ集合に読み込み許可を持
たなければならない。
GETZCNT システムコールは集合の semnum 番目のセマフォの semzcnt の値 (
このセマフォの値が 0 になるのを待っているプロセスの数) を返す
(集合の semnum 番目のセマフォの semval の値が 0 になるのを 待
っているプロセスの数を返す)。呼び出したプロセスはそのセマフォ
集合に読み込み許可を持たなければならない。
SETALL 集合の全てのセマフォの semval に arg.array で指定された値を設
定する。その集合に関連する semid_ds 構造体の sem_ctime メンバ
ーの値も更新する。全てのプロセスのセマフォの変更についての ア
ン ドゥ・エントリ (semop(2) を参照) は消去 (clear) される。セ
マフォの値の変更により、他のプロセス内でブロックされ て い る
semop(2) コールの続行が許可されると、それらのプロセスは起こさ
れる (wake up)。 semnum 引き数は無視される。呼び出したプロ セ
ス はそのセマフォ集合に変更 (書き込み) 許可を持たなければなら
ない。
SETVAL 集合の semnum 番目のセマフォの semval に arg.val の値を設定す
る。その集合に関連する semid_ds 構造体の sem_ctime メンバーの
値も更新する。全てのプロセスのセマフォの変更についてのアン ド
ゥ ・エントリは消去される。セマフォの値の変更により、他のプロ
セス内でブロックされている semop(2) コールの続行が許可され る
と 、それらのプロセスは起こされる (wake up)。呼び出したプロセ
スはそのセマフォ集合に変更 (書き込み) 許可を持たなければな ら
ない。
返り値
失敗した場合、 semctl() は -1 を返し、 errno にそのエラーを示す。
そうでなければシステムコールは cmd によって以下の負でない値を返す:
GETNCNT semncnt の値
GETPID sempid の値
GETVAL semval の値
GETZCNT semzcnt の値
IPC_INFO 全てのセマフォ集合に関する情報を管理しているカーネルの内部
配列の使用中エントリのインデックスの最大値 (この情報は、 シ
ス テ ム の 全 てのセマフォ集合に関する情報を取得するために
SEM_STAT 操作を繰り返し実行する際に使用できる)
SEM_INFO IPC_INFO と同じ
SEM_STAT semid で指定されたインデックスを持つセマフォ集合の識別子
cmd の値がそれ以外の場合、成功すると 0 が返される。
エラー
失敗した場合は errno には以下の値のどれかが設定される:
EACCES cmd 引き数が GETALL, GETPID, GETVAL, GETNCNT, GETZCNT, IPC_STAT,
SEM_STAT, SETALL, SETVAL のうちの何れかの値を持ち、呼び出したプ
ロセスがセマフォに対して必要とされる許可と CAP_IPC_OWNER ケー パ
ビリティ (capability) を持っていない。
EFAULT arg.buf または arg.array で指されているアドレスにアクセスするこ
とができない。
EIDRM セマフォ集合が削除された。
EINVAL cmd または semid に無効な値が指定された。もしくは、 SEM_STAT 操
作 の場合に、 semid で指定されたインデックス値が現在未使用の配列
のスロットを参照いていた。
EPERM cmd 引き数に IPC_SET または IPC_RMID が指定され、呼び出したプ ロ
セスの実効ユーザ ID がセマフォの (sem_perm.cuid で見つかる) 作成
者または (sem_perm.uid で見つかる) 所有者でもなく、プロ セ ス が
CAP_SYS_ADMIN ケーパビリティを持たない。
ERANGE cmd 引き数に SETALL または SETVAL が指定され、(集合のセマフォの
どれかの) semval に設定される値が 0 より小さいか、実 装 の 制 限
SEMVMX よりも大きい。
準拠
SVr4, POSIX.1-2001.
注意
IPC_INFO, SEM_STAT, SEM_INFO 操作は ipcs(8) プログラムによって割当られ
た資源について情報を提供するために使用される。将来的にはこれらは変更 さ
れるか、 /proc ファイル・システム・インタフェースに移動されるかもしれな
い。
構造体 semid_ds 内の多くのフィールドは、 Linux 2.2 では short 型だっ た
が 、Linux 2.4 では long 型になった。この利点を生かすには、glibc-2.1.91
以降の環境下で再コンパイルすれば十分である。カーネルは新しい形式の呼 び
出しと古い形式の呼び出しを cmd 内の IPC_64 フラグで区別する。
初期のバージョンの glibc では、 semun 共用体は で定義されて
いたが、 POSIX.1-2001 では呼び出し側がこの共用体を定義する必要がある 。
こ の 共 用 体 が 定 義 さ れ て い ない glibc のバージョンでは、マクロ
_SEM_SEMUN_UNDEFINED が で定義されている。
以下は semctl() コールに影響するセマフォ集合のシステム制限:
SEMVMX semval の最大値 : 実装依存 (32767)。
移植性を高めるための一番良い方法は、常に 4 個の引き数で semctl() を呼び
出すことである。
関連項目
ipc(2), semget(2), semop(2), capabilities(7), sem_overview(7), svipc(7)
Linux 2008-08-06 SEMCTL(2)
SEMCTL(2) Linux Programmer’s Manual SEMCTL(2)
NAME
semctl - semaphore control operations
SYNOPSIS
#include
#include
#include
int semctl(int semid, int semnum, int cmd, ...);
DESCRIPTION
semctl() performs the control operation specified by cmd on the
semaphore set identified by semid, or on the semnum-th semaphore of
that set. (The semaphores in a set are numbered starting at 0.)
This function has three or four arguments, depending on cmd. When
there are four, the fourth has the type union semun. The calling pro-
gram must define this union as follows:
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
The semid_ds data structure is defined in as follows:
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned short sem_nsems; /* No. of semaphores in set */
};
The ipc_perm structure is defined in as follows (the high-
lighted fields are settable using IPC_SET):
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
Valid values for cmd are:
IPC_STAT Copy information from the kernel data structure associated
with semid into the semid_ds structure pointed to by arg.buf.
The argument semnum is ignored. The calling process must
have read permission on the semaphore set.
IPC_SET Write the values of some members of the semid_ds structure
pointed to by arg.buf to the kernel data structure associated
with this semaphore set, updating also its sem_ctime member.
The following members of the structure are updated:
sem_perm.uid, sem_perm.gid, and (the least significant 9 bits
of) sem_perm.mode. The effective UID of the calling process
must match the owner (sem_perm.uid) or creator
(sem_perm.cuid) of the semaphore set, or the caller must be
privileged. The argument semnum is ignored.
IPC_RMID Immediately remove the semaphore set, awakening all processes
blocked in semop(2) calls on the set (with an error return
and errno set to EIDRM). The effective user ID of the call-
ing process must match the creator or owner of the semaphore
set, or the caller must be privileged. The argument semnum
is ignored.
IPC_INFO (Linux-specific)
Returns information about system-wide semaphore limits and
parameters in the structure pointed to by arg.__buf. This
structure is of type seminfo, defined in if the
_GNU_SOURCE feature test macro is defined:
struct seminfo {
int semmap; /* Number of entries in semaphore
map; unused within kernel */
int semmni; /* Maximum number of semaphore sets */
int semmns; /* Maximum number of semaphores in all
semaphore sets */
int semmnu; /* System-wide maximum number of undo
structures; unused within kernel */
int semmsl; /* Maximum number of semaphores in a
set */
int semopm; /* Maximum number of operations for
semop(2) */
int semume; /* Maximum number of undo entries per
process; unused within kernel */
int semusz; /* Size of struct sem_undo */
int semvmx; /* Maximum semaphore value */
int semaem; /* Max. value that can be recorded for
semaphore adjustment (SEM_UNDO) */
};
The semmsl, semmns, semopm, and semmni settings can be
changed via /proc/sys/kernel/sem; see proc(5) for details.
SEM_INFO (Linux-specific)
Returns a seminfo structure containing the same information
as for IPC_INFO, except that the following fields are
returned with information about system resources consumed by
semaphores: the semusz field returns the number of semaphore
sets that currently exist on the system; and the semaem field
returns the total number of semaphores in all semaphore sets
on the system.
SEM_STAT (Linux-specific)
Returns a semid_ds structure as for IPC_STAT. However, the
semid argument is not a semaphore identifier, but instead an
index into the kernel’s internal array that maintains infor-
mation about all semaphore sets on the system.
GETALL Return semval (i.e., the current value) for all semaphores of
the set into arg.array. The argument semnum is ignored. The
calling process must have read permission on the semaphore
set.
GETNCNT The system call returns the value of semncnt (i.e., the num-
ber of processes waiting for the value of this semaphore to
increase) for the semnum-th semaphore of the set (i.e., the
number of processes waiting for an increase of semval for the
semnum-th semaphore of the set). The calling process must
have read permission on the semaphore set.
GETPID The system call returns the value of sempid for the semnum-th
semaphore of the set (i.e., the PID of the process that exe-
cuted the last semop(2) call for the semnum-th semaphore of
the set). The calling process must have read permission on
the semaphore set.
GETVAL The system call returns the value of semval for the semnum-th
semaphore of the set. The calling process must have read
permission on the semaphore set.
GETZCNT The system call returns the value of semzcnt (i.e., the num-
ber of processes waiting for the value of this semaphore to
become zero) for the semnum-th semaphore of the set (i.e.,
the number of processes waiting for semval of the semnum-th
semaphore of the set to become 0). The calling process must
have read permission on the semaphore set.
SETALL Set semval for all semaphores of the set using arg.array,
updating also the sem_ctime member of the semid_ds structure
associated with the set. Undo entries (see semop(2)) are
cleared for altered semaphores in all processes. If the
changes to semaphore values would permit blocked semop(2)
calls in other processes to proceed, then those processes are
woken up. The argument semnum is ignored. The calling pro-
cess must have alter (write) permission on the semaphore set.
SETVAL Set the value of semval to arg.val for the semnum-th
semaphore of the set, updating also the sem_ctime member of
the semid_ds structure associated with the set. Undo entries
are cleared for altered semaphores in all processes. If the
changes to semaphore values would permit blocked semop(2)
calls in other processes to proceed, then those processes are
woken up. The calling process must have alter permission on
the semaphore set.
RETURN VALUE
On failure semctl() returns -1 with errno indicating the error.
Otherwise the system call returns a non-negative value depending on cmd
as follows:
GETNCNT the value of semncnt.
GETPID the value of sempid.
GETVAL the value of semval.
GETZCNT the value of semzcnt.
IPC_INFO the index of the highest used entry in the kernel’s inter-
nal array recording information about all semaphore sets.
(This information can be used with repeated SEM_STAT opera-
tions to obtain information about all semaphore sets on the
system.)
SEM_INFO As for IPC_INFO.
SEM_STAT the identifier of the semaphore set whose index was given
in semid.
All other cmd values return 0 on success.
ERRORS
On failure, errno will be set to one of the following:
EACCES The argument cmd has one of the values GETALL, GETPID, GETVAL,
GETNCNT, GETZCNT, IPC_STAT, SEM_STAT, SETALL, or SETVAL and the
calling process does not have the required permissions on the
semaphore set and does not have the CAP_IPC_OWNER capability.
EFAULT The address pointed to by arg.buf or arg.array isn’t accessible.
EIDRM The semaphore set was removed.
EINVAL Invalid value for cmd or semid. Or: for a SEM_STAT operation,
the index value specified in semid referred to an array slot
that is currently unused.
EPERM The argument cmd has the value IPC_SET or IPC_RMID but the
effective user ID of the calling process is not the creator (as
found in sem_perm.cuid) or the owner (as found in sem_perm.uid)
of the semaphore set, and the process does not have the
CAP_SYS_ADMIN capability.
ERANGE The argument cmd has the value SETALL or SETVAL and the value to
which semval is to be set (for some semaphore of the set) is
less than 0 or greater than the implementation limit SEMVMX.
CONFORMING TO
SVr4, POSIX.1-2001.
NOTES
The IPC_INFO, SEM_STAT and SEM_INFO operations are used by the ipcs(8)
program to provide information on allocated resources. In the future
these may modified or moved to a /proc file system interface.
Various fields in a struct semid_ds were typed as short under Linux 2.2
and have become long under Linux 2.4. To take advantage of this, a
recompilation under glibc-2.1.91 or later should suffice. (The kernel
distinguishes old and new calls by an IPC_64 flag in cmd.)
In some earlier versions of glibc, the semun union was defined in
, but POSIX.1-2001 requires that the caller define this
union. On versions of glibc where this union is not defined, the macro
_SEM_SEMUN_UNDEFINED is defined in .
The following system limit on semaphore sets affects a semctl() call:
SEMVMX Maximum value for semval: implementation dependent (32767).
For greater portability it is best to always call semctl() with four
arguments.
SEE ALSO
ipc(2), semget(2), semop(2), capabilities(7), sem_overview(7), svipc(7)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2008-08-06 SEMCTL(2)