#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <errno.h>
union semun {
int val;
}sem;
int main(int argc, char const *argv[])
{
//信号灯集实现申请资源,释放资源,实现进程之间的同步操作
//1、创建k值
key_t key;
key = ftok("./app", 's');
if (key < 0)
{
perror("ftok err\n");
return -1;
}
//2、创建或打开信号灯集
int semid = semget(key, 2, IPC_CREAT | IPC_EXCL | 0666);
if (semid <= 0)
{
if (errno == EEXIST)
semid = semget(key, 2, 0666);
else
{
perror("semget err\n");
return -1;
}
}
else
{
//3、信号灯集的初始化
sem.val = 10;
semctl(semid, 0, SETVAL, sem);
sem.val = 0;
semctl(semid, 1, SETVAL, sem);
}
printf("%d\n", semctl(semid, 0, GETVAL));
printf("%d\n",semctl(semid,1,GETVAL));
//4、申请资源
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = 0;
semop(semid, &buf, 1);
//5、释放资源
buf.sem_num = 1;
buf.sem_op = 1;
buf.sem_flg = 0;
semop(semid, &buf, 1);
printf("%d\n", semctl(semid, 0, GETVAL));
printf("%d\n", semctl(semid, 1, GETVAL));
//semctl(semid,0,IPC_RMID);
//semctl(semid,1,IPC_RMID);
return 0;
}
此代码是信号灯集的创建步骤,信号灯集是进程间通信的一种方式,和共享内存结合,实现进程间的同步操作。