编程接口指南

信号量操作

semop(2) 可针对信号量集执行操作。 semid 参数是先前 semget(2) 调用所返回的信号量 ID。 sops 参数是指向结构数组的指针,其中每种结构都包含以下有关信号量操作的信息:

sembuf 结构指定信号量操作,如 sys/sem.h 中所定义。 nsops 参数指定数组的长度,其最大大小由 SEMOPM 配置选项确定。 此选项可确定单个 semop(2) 调用所允许的最大操作数,并缺省设置为 10。

要执行的操作按如下方式确定:

可与 semop(2) 一起使用的两个控制标志是 IPC_NOWAITSEM_UNDO

IPC_NOWAIT

可以针对数组中的任何操作设置。 如果接口无法执行任何设置了 IPC_NOWAIT 的操作,则使接口返回且不更改任何信号量值。 如果接口尝试以大于信号量当前值的数量递减信号量,或者测试非零信号量等于零,则接口会失败。

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

 ...