通用代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
union _semun{
int val;
};
int main(){
// 1.创建(打开)信号量集
int semid = semget(1234, 1, IPC_CREAT|0644);
if(semid < 0){
perror("semget");
return 1;
}
// 2.初始化信号量集
union _semun semun;
semun.val = 1;
semctl( semid, 0, SETVAL, semun );
// 3.P()
struct sembuf buf_p;
buf_p.sem_num = 0;
buf_p.sem_flg = 0;
buf_p.sem_op = -1;
semop(semid , &buf_p, 1);
// 4.操作
// 5.V()
struct sembuf buf_v;
buf_v.sem_num = 0;
buf_v.sem_flg = 0;
buf_v.sem_op = 1;
semop(semid , &buf_v, 1);
// 6.删除信号集
if ( semctl(semid, 0, IPC_RMID) < 0 ){
perror("semctl");
return 1;
}
return 0;
}
API
创建: int semget(key_t key, int nsems, int semflg);
key: 唯一值
nsems: 信号量的个数,一般为1,打开为0
semflg:操作 IPC_CREAT|0644,打开为0
初始化:int semctl(int semid, int semnum, int cmd, …);
需要自己自构建结构体
union _semun{ int val; };
semnum: 想要初始化第几个信号量:0为第1个,1为第2个
cmd: 初始化的操作码是:SETVAL
...: 填入联合体semun
PV操作: int semop(int semid, struct sembuf *sops, unsigned nsops);
1.声明一个结构体 sembuf
2.给sembuf进行赋值,sem_num表示那个信号量,sem_op表示什么操作,sem_flg 为0
3.nsops表示对几个信号量进行操作。
卸载:int semctl(int semid, int semnum, int cmd, …);
semnum : 0
cmd : IPC_RMID