与消息队列类似,内核为存在于其地址空间中的每个信号量集维护一个特殊的内部数据结构。此结构的类型为semid_ds,并在linux/sem.h中定义如下
/* One semid data structure for each set of semaphores in the system. */ struct semid_ds { struct ipc_perm sem_perm; /* permissions .. see ipc.h */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ struct sem *sem_base; /* ptr to first semaphore in array */ struct wait_queue *eventn; struct wait_queue *eventz; struct sem_undo *undo; /* undo requests on this array */ ushort sem_nsems; /* no. of semaphores in array */ };
这是ipc_perm结构的实例,该结构在linux/ipc.h中为我们定义。它保存信号量集的权限信息,包括访问权限以及关于集合创建者的信息(uid 等)。
上次semop()操作的时间(稍后详细介绍)
上次对此结构进行更改的时间(模式更改等)
指向数组中第一个信号量的指针(请参阅下一个结构)
此数组中 undo 请求的数量(稍后详细介绍)
信号量集(数组)中信号量的数量