プログラミングインタフェース

セマフォーの操作

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

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

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

semop(2) で使用できる制御フラグは IPC_NOWAITSEM_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;            /* work area */
         int              nsops;        /* number of operations to do */
         int              semid;        /* semid of semaphore set */
         struct sembuf    *sops;        /* ptr to operations to perform */
         ...
         if ((i = semop(semid, sops, nsops)) == –1) {
                 perror("semop: semop failed");
         } else
                 (void) fprintf(stderr, "semop: returned %d\n", i);
...