システムインタフェース

セマフォの操作

semop(2) は、セマフォのセットへの操作を実行します。semid 引数は、前の semget(2) 呼び出しによって戻されたセマフォ ID です。sops 引数は、セマフォ操作について次のような情報を含んでいる構造体の配列へのポインタです。

sembuf 構造体は、<sys/sem.h> に定義されているセマフォ操作を指定します。nsops 引数は配列の長さを指定します。配列の最大長は、SEMOPM 構成オプションで指定されます。これは単一の semop(2) 呼び出しで許される最大操作数で、デフォルトでは 10 に設定されています。

実行する操作は、次のように判定されます。

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);
 ...