信号量
信号量不是一种通信方式,只是一个处理互斥,一般用于共享内存互斥
将信号量处理过程比作停车,有车位和停车场入口两个观测点,车位(空间)、车(数据)
发送端:车辆先经过停车场入口,停车场会先显示车位-1(空间P操作 ),接下来车辆入库车辆+1(数据V操作)
接收端:车辆离开停车场先离开车位,所以是车辆先离开车位车辆-1(数据P操作),经过停车场出口驶离停车场时,停车场会显示车位+1(空间V操作)
1. 根据key值获取信号量ID – semget() — man 2 semget
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);
key: key值 nsems: 信号量元素的个数 semflg: IPC_CREAT | 0666
返回值: 成功:信号量ID号 失败:-1
2. P/V 操作 – semop() — man 2 semop
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int semop(int semid, struct sembuf *sops, unsigned nsops);
semid: 信号量的ID号 sops: 信号量进行P/V操作的结构体 nsops: 信号量操作结构体个数 :1
struct sembuf{
unsigned short sem_num; /* semaphore number / 操作的元素的下标 空间:0 数据:1
short sem_op; / semaphore operation / P(-1) / V(1) ??
short sem_flg; / operation flags */ 选项: 0 }
3. 设置信号量的属性 semctl – man 2 semctl
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int semctl(int semid, int semnum, int cmd, ...);
semid: 信号量ID号 semnum: 操作的成员的下标对象 空间: 0 数据: 1 cmd: 删除:
IPC_RMID 设置初始值: SETVAL …: 额外的参数 空间/数据起始值例子: 设置空间的起始值:1 数据为:0 semctl(shmid,0,SETVAL,1); semctl(shmid,1,SETVAL,0);
发送端:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>
int main()
{
key_t key1,key2;
int shmid