信号量的基本内容:
信号量是一种资源,可以被初始化、申请、释放、销毁
P操作:申请资源
V操作:释放资源
1.无名信号量:
1.sem_init
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:
初始化信号量
参数:
sem:信号量空间首地址
pshared:
0 一个进程中的所有线程间共享
非0 进程间共享
value:
初始化的值
返回值:
成功返回0
失败返回-1
2.sem_destroy:
int sem_destroy(sem_t *sem);
功能:
信号量的销毁
参数:
sem:信号量空间首地址
返回值:
成功返回0
失败返回-1
3. sem_wait:
int sem_wait(sem_t *sem);
功能:
申请信号量
4.sem_post:
int sem_post(sem_t *sem);
功能:
释放信号量
2.有名信号量:
1.创建 semget
int semget(key_t key, int nsems, int semflg);
功能:
创建一组信号量
参数:
key:IPC对象名
nsems:信号量的个数
semflg:IPC_CREAT
返回值:
成功返回信号量ID
失败返回-1
2.销毁 semctl
int semctl(int semid, int semnum, int cmd, ...);
功能:
向信号灯发送命令
参数:
semid: 信号灯ID号
semnum:具体操作信号量的编号
cmd:
IPC_RMID 删除信号灯
SETVAL 设置信号量的值
返回值:
成功返回0
失败返回-1
初始化: 【要在全局区定义】
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO(Linux-specific) */
};
3.申请信号量 / 释放信号量 semop
int semop(int semid, struct sembuf *sops, size_t nsops);
功能:
对信号量完成操作
参数:
semid:信号灯的ID号
sops:信号量操作的数组首地址
nsops:数组元素个数
返回值:
成功返回0
失败返回-1
unsigned short sem_num; /* semaphore number */ 操作信号量的下标
short sem_op; /* semaphore operation */ 具体对信号量的操作(申请:-1 释放:+1)
short sem_flg; /* operation flags */ SEM_UNDO