信号量是一种用于对多个进程访问的临界资源进行控制的一种机制。简单来说,信号量的实质是一个整型计数器,当信号量为非负值时,它表示可供访问的临界资源的单元个数;当信号量的值为负时,它表示等待临界资源的进程数。
与信号量有关的系统调用函数有三个,下面将分别介绍。
相关结构体声明:
每个信号量集都有一个与其对应的结构,用来记录信号量集的各种信息,具体定义如下所示:
struct semid_ds
{
struct ipc_perm sem_perm; //信号量集的所有者和权限
struct sem* sem_base; //指向信号量集中第一个信号量的sem结构
ushort sem_nsems; //信号量集中信号量的个数
time_t sem_otime; //最近一次调用semop函数的时间
time_t sem_ctime; //最近一次改变该信号量集的时间
};
sem结构用于记录一个信号量的信息,具体定义如下:
struct sem
{
ushort semval; //信号量的值
pid_t pid; //最近一次访问该资源的进程pid
ushort semncnt; // 等待资源的进程数
ushort semzcnt; //可用资源的数量
};