一 、创建或者打开信号量
int semget(key_t key,
int nsems,//信号量集中信号量的个数
int flag);//打开:0,创建:IPC_CREAT|0644
返回值:返回信号量集的标识符
查看信号量:
ipcs -s
具体案例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main(void)
{
int id=semget(1234,1,IPC_CREAT|0644);
if(id==-1) perror("semget"),exit(1);
printf("create ok!\n");
}
二、设置信号量初值
semctl( int semid,//信号量集的标识符
int semnum,//信号量集中的第几个信号量,信号量集数组的下标
int cmd,//SETVAL
su);//信号量初值
union semun{
int val;//value of SETVAL
}
三、查看信号量的值
semctl( int semid,
int semnum,//信号量集中的第几个信号量,信号量集数组的下标
int cmd,//GETVAL
0);
返回值:当前信号量的值
四、PV操作
semop(int semid,//信号量标识符
struct sembuf sb[],//进行操作的信号量的结构体数组
int len); //进行操作信号量的个数
返回值:返回信号量集的标识符
struct sembuf{
short sem_num,//信号量的下标
short sem_op,//1V,-1P
short sem_flag,//0
}
P操作
void p(int id)
{
struct sembuf sb[1];
sb[0].sem_num=0;
sb[0].sem_op=-1;
sb[0].sem_flg=0;
semop(id,sb,1);
}
int main(void)
{
int id=semget(1234,0,0);
if(id==-1) perror("semget"),exit(1);
p(id);
}
V操作:
void v(int id)
{
struct sembuf sb[1];
sb[0].sem_num=0;
sb[0].sem_op=1;
sb[0].sem_flg=0;
semop(id,sb,1);
}
int main(void)
{
int id=semget(1234,0,0);
if(id==-1) perror("semget"),exit(1);
v(id);
}
操作结果: