semop(2) は、セマフォのセットへの操作を実行します。semid 引数は、以前の semget(2) 呼び出しによって戻されたセマフォ ID です。sops 引数は、セマフォ操作について次のような情報を含む構造体の配列へのポインタです。
セマフォ番号
実行する操作
制御フラグ (存在する場合)
sembuf 構造体は、sys/sem.h に定義されているセマフォ操作を指定します。nsops 引数は配列の長さを指定します。配列の最大長は、SEMOPM 構成オプションで指定されます。SEMOPM オプションは単一の semop(2) 呼び出しで指定できる最大操作数で、デフォルトでは 10 に設定されています。
実行する操作は、次のように判断されます。
正の整数の場合は、セマフォの値をその数だけ増加する
負の整数の場合は、セマフォの値をその数だけ減少する。セマフォを 0 未満の値に設定しようとすると、IPC_NOWAIT が有効であるかどうかによって、失敗するかブロックされる
値が 0 の場合は、セマフォの値が 0 になるのを待つ
semop(2) で使用できる制御フラグは IPC_NOWAIT と SEM_UNDO の 2 つです。
IPC_NOWAIT |
配列内のどの操作についても設定できる。IPC_NOWAIT が設定されている操作を実行できなかった場合、セマフォの値を変更せずにインタフェースを戻す。セマフォを現在の値より多く減らそうしたり、セマフォが 0 でないときに 0 かどうか検査しようとするとインタフェースは失敗する |
SEM_UNDO |
プロセスの終了時に配列内の個々の操作を取り消す |
次のコードに、semop(2) の使用例を示します。
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ... int i; /* 作業領域 */ int nsops; /* 実行する操作数 */ int semid; /* セマフォセット ID */ struct sembuf *sops; /* 実行する操作のポインタ */ ... if ((i = semop(semid, sops, nsops)) == –1) { perror("semop: semop failed"); } else (void) fprintf(stderr, "semop: returned %d\n", i); ...