本文主要是介绍进程间通信----信号灯集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一丶概念
二丶操作步骤
三丶命令
四丶函数接口
1.创建信号灯集
2.初始化或删除信号灯集
3.pv操作
练习:
一丶概念
System V信号灯集是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。
通过信号灯集实现共享内存的同步操作
二丶操作步骤
1. 创建key
2. 创建或打开信号灯集 semget
3. 初始化信号灯集 semctl
4. pv操作 semop
5. 删除信号灯集 semctl
三丶命令
ipcs -s: 查看信号灯集
ipcrm -s semid: 删除信号灯集
注意:有时候可能会创建失败,或者semid为0,所以用命令看看,删了重新创建就可以了。
四丶函数接口
1.创建信号灯集
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
功能:创建/打开信号灯
参数:key:ftok产生的key值nsems:信号灯集中包含的信号灯数目semflg:信号灯集的访问权限,通常为IPC_CREAT |0666
返回值:成功:信号灯集ID失败:-1
2.初始化或删除信号灯集
int semctl ( int semid, int semnum,int cmd,…/*union semun arg*/);
功能:信号灯集合的控制(初始化/删除)
参数:semid:信号灯集IDsemnum: 要操作的集合中的信号灯编号cmd:GETVAL:获取信号灯的值,返回值是获得值SETVAL:设置信号灯的值,IPC_RMID:从系统中删除信号灯集合...:当cmd为SETVAL时,需要传递共用体
返回值:成功 0失败 -1
共用体格式:union semun {int val; /* 信号量的初值 */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) */};
用法:
union semun {int val;
};
union semun sem;
sem.val = 10;
semctl(semid, 0, SETVAL, sem); //对编号为0的信号灯设置初值为10
用法:semctl(semid, 0, IPC_RMID) // 0:表示信号灯的编号,指定任意一个即可删除
2. 当cmd为GETVAL时,表示获取信号灯的值
用法:printf("%d\n", semctl(semid, 0, GETVAL));
3.pv操作
int semop ( int semid, struct sembuf *opsptr, size_t nops);
功能:对信号灯集合中的信号量进行PV操作
参数:semid:信号灯集IDopsptr:操作方式nops: 要操作的信号灯的个数 1个
返回值:成功 :0失败:-1
struct sembuf {short sem_num; // 要操作的信号灯的编号short sem_op; // 0 : 等待,直到信号灯的值变成0// 1 : 释放资源,V操作// -1 : 分配资源,P操作 short sem_flg; // 0(阻塞),IPC_NOWAIT, SEM_UNDO
};
练习:
这篇关于进程间通信----信号灯集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!