信号灯也叫信号量 用于进程/线程同步或互斥的机制
信号灯的类型
1.Posix 无名信号灯
2.Posix 有名信号灯
3.System V 信号灯
信号灯的含义
计数信号灯(1和2都是)
System V信号灯是一个或多个计数信号灯的集合(可操作集合中的多个信号灯)
System V 信号灯使用步骤
打开 / 创建 信号灯 semget
信号灯初始化 semctl
P/V 操作 semop
删除信号灯semctl
信号灯的创建/打开
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg )
成功返回信号灯ID 失败返回-1
key 和消息队列关联的key IPC_PRIVATE 或 ftok
nsems 集合中包含的计数信号灯个数
semflg 标志位IPC_CREAT | 0666 IPC_EXCL
信号灯初始化
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...)
成功返回0 失败返回EOF
semid 要操作的信号灯集id
semnum 要操作的集合中的信号灯编号
cmd 执行的操作 SEVAL IPC_RMID
union semun 取决于cmd
union semun
{
int val; //要初始化的值
struct semid_ds *buf;
unsinged short *array;0;
struct seminfo *_buf;
}
信号灯 P/V操作
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops)
成功返回0 失败返回-1
semid 要操作的信号灯集id
sops 描述对信号灯操作的结构体(数组)
nsops 要操作的信号灯的个数
struct sembuf
{
short semnum;
short sem_op;
short sem_flg;
}
semnum 信号灯编号
sem_op -1 : P操作 1 :V操作
sem_flg 0(操作不成功则一直阻塞 直到成功为止) / IPC_NOWAIT