1.1信号量
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。
信号量分为以下三种:
1、System V信号量,在内核中维护,可用于进程或线程间的同步,常用于进程间的同步
2、Posix 有名信号量,一种来源于POSIX技术规范的实时扩展方案,可用于进程或线程间的同步,常用于线程。
3、Posix 基于内存的信号量, 存放在共享内存区中, 可用于进程或线程间的同步。
为了获得共享资源进程需要执行下列操作:
( 1) 测试控制该资源的信号量。
( 2) 若信号量的值为正, 则进程可以使用该资源。 进程信号量值减 1, 表示它使用了一个
资源单位。 此进程使用完共享资源后对应的信号量会加 1。 以便其他进程使用。
( 3) 若信号量的值为 0, 则进程进入休息状态, 直至信号量值大于 0。 进程被唤醒, 返回第
( 1) 步。
1、int semget(key_t key,int nsems,int flag);
函数 semget 创建一个信号量集或访问一个已存在的信号量集。 返回值: 成功时, 返回一个称为信号量标识符的整数, semop 和 semctl 会使用它; 出错时, 返回-1
2、int semctl(int semid, int semnum, int cmd, …);对信号量进行初始化
参数 cmd 为执行的操作。 通常为: IPC_RMID( 立即删除信号集, 唤醒所有被阻塞的进程) 、 GETVAL( 根据 semun 返回信号量的值, 从 0 开始, 第一个信号量编号为 0) 、 SETVAL( 根据 semun 设定信号的值, 从 0 开始, 第一个信号量编号为 0) 、GETALL( 获取所有信号量的值, 第二个参数为 0, 将所有信号的值存入 semun.array中) 、 SETALL( 将所有 semun.array 的值设定到信号集中, 第二个参数为 0) 等。
3、int semop(int semid,struct sembuf *sops,size_t num_sops);short sem_op; //sem_op 成员的值是信号量在一次操作中需要改变的
数值。 通常只会用到两个值, 一个是-1, 也就是 p 操作, 它等待信号量变为可用; 一个是+1, 也就是 v 操作, 它发送信号通知信号量现在可用。
short sem_flg; //通常设为: SEM_UNDO, 程序结束, 信号量为 semop
调用前的值。
参数 nops 为 sops 指向的 sembuf 结构体数组的大小。
函数 semctl 用来直接控制信号量信息。 函数返回值: 成功时, 返回 0; 失败时, 返回-1
4.参数 cmd 为执行的操作。 通常为: IPC_RMID( 立即删除信号集, 唤醒所有被阻塞的进程)GETVAL( 根据 semun 返回信号量的值, 从 0 开始, 第一个信号量编号为 0) 、 SETVAL( 根据 semun 设定信号的值, 从 0 开始, 第一个信号量编号为 0) 、GETALL( 获取所有信号量的值, 第二个参数为 0, 将所有信号的值存入 semun.array中) 、 SETALL( 将所有 semun.array 的值设定到信号集中, 第二个参数为 0) 等。
联合体:所有的数据在一块空间,起始地址全部都是相等的
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
The semid_ds data structure is defined in <sys/sem.h>as follows;
struct semid _ds{
struct ipc_perm sem_perm;
time_t sem_otime;
time_t sem_ctime;
unsigned long sem_nsems;
};