semop(2) 可针对信号量集执行操作。 semid 参数是先前 semget(2) 调用所返回的信号量 ID。 sops 参数是指向结构数组的指针,其中每种结构都包含以下有关信号量操作的信息:
信号量数
要执行的操作
控制标志(如果存在)
sembuf 结构指定信号量操作,如 sys/sem.h 中所定义。 nsops 参数指定数组的长度,其最大大小由 SEMOPM 配置选项确定。 此选项可确定单个 semop(2) 调用所允许的最大操作数,并缺省设置为 10。
要执行的操作按如下方式确定:
正整数使信号量值递增相应的值。
负整数使信号量值递减相应的值。 尝试将信号量设置为小于零的值会失败或阻塞,具体取决于 IPC_NOWAIT 是否生效。
值为零表示等待信号量值达到零。
可与 semop(2) 一起使用的两个控制标志是 IPC_NOWAIT 和 SEM_UNDO。
可以针对数组中的任何操作设置。 如果接口无法执行任何设置了 IPC_NOWAIT 的操作,则使接口返回且不更改任何信号量值。 如果接口尝试以大于信号量当前值的数量递减信号量,或者测试非零信号量等于零,则接口会失败。
当进程存在时,允许撤消数组中的单个操作。
以下代码说明了 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); ...