struct semid_ds {
struct ipc_perm sem_perm; /*信号量的访问权限结构*/
struct sem *sem_base; /*指向信号量集的指针*/
ushort sem_nsems; /*信号量集中的信号量个数*/
time_t sem_otime;/*time of last semop()*/
time_t sem_ctime; /*time of creation or last IPC SET*/
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
struct sem {
ushort_t semval; /*信号量的值,非负值*/
short sempid; /*最后成功操作semop的进程ID*/
ushort_t semncnt; /*等待semval大于当前值的计数*/
ushort_t semzcnt; /*等待semval等于0的计数*/
};
#include
int semget(key_t key, int nsems; int oflag);
返回值:成功则返回非负的信号量标识符,出错则返回-1.
nsems参数指定了集合中的信号量数目。如果我们不创建一个新的信号量集,而只是访问一个已存在的集合,那就可以把该参数指定为0.一旦创建完一个信号量集,我们就不能改变其中的信号量数。
oflag是SEM_R,SEM_A的组合,还可以与IPC_CREAT/IPC_CREAT|IPC_EXCL按位或。
当实际创建一个新的信号量集时,相应的semid_ds结构的以下成员将被初始化。
1)sem_perm结构中的uid和cuid成员被设置为调用进程的有效用户ID,gid和cgid成员被置为调用进程的有效组ID。
2)oflag参数中的读写权限位存入sem_perm.mode
3)sem_otime被设置为0,sem_ctime被设置为当前时间
4)sem_nsems被设置为nsems参数的值
5)与该集合中每个信号量关联的各个sem结构并不初始化。这些结构是在以SET_VAL或SETALL命令调用semctl是初始化的。