semop(2) は、セマフォのセットへの操作を実行します。semid 引数は、前の semget(2) 呼び出しによって戻されたセマフォ ID です。sops 引数は、セマフォ操作について次のような情報を含んでいる構造体の配列へのポインタです。
セマフォ番号
実行する操作
制御フラグ (存在する場合)
sembuf 構造体は、<sys/sem.h> に定義されているセマフォ操作を指定します。nsops 引数は配列の長さを指定します。配列の最大長は、SEMOPM 構成オプションで指定されます。これは単一の semop(2) 呼び出しで許される最大操作数で、デフォルトでは 10 に設定されています。
実行する操作は、次のように判定されます。
正の整数の場合は、セマフォの値をそれだけ増加します。
負の整数の場合は、セマフォの値をそれだけ減少します。セマフォをゼロより小さい値に設定しようとすると、IPC_NOWAIT が有効であるかどうかに応じて、失敗するかブロッキングされます。
値がゼロの場合は、セマフォの値がゼロになるのを待ちます。
semop(2) では、次の 2 つの制御フラグを使用できます。
IPC_NOWAIT |
配列内のどの操作についても設定できる。この関数は、IPC_NOWAIT が設定されている操作が正しく実行できなかった場合に、セマフォの値を変更せずに戻る。セマフォを現在の値より多く減らそうしたり、セマフォがゼロでないときにゼロかどうか検査しようとすると関数は失敗する。 |
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); ... |