IPC 进程间通信方式——信号量
信号量
- 本质上是共享资源的数目,用来控制对共享资源的访问。
- 用于进程间的互斥和同步
- 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对多对信号量一次性操作。对信号量集中所有的操作可以要求全部成功,也可以部分成功
- 二元信号量(信号灯)值为0和1
- 对信号量做PV操作
信号量集属性
#include<sysm.h>
struct semid_ds
{
struct ipc_perm sem_perm;
unsigned short sem_nseme; //信号灯的数量
time_t sem_otime; //最后一次操作的时间
time_t sem_ctime; //最后一次改变的时间
};
创建信号量集
#include <sysm.h>
int semget(key_t key,int nsems,int flag);
//返回:如果成功,返回信号量集ID,出错返回-1
- 参数
- key:用户指定的信号量集键值
- nsems:信号量集中信号量的个数
- flag:IPC CREAT,IPC EXCL等权限组合
- 若创建消息队列,key可以指定键值,也可以设置为IPC_PRIVATE(0)。若打开进行查询,则key不能为0,必须是一个非零的值,否则查询不到
信号量集控制
#include <sys/msg.h>
int semctl(int semid,int semnum,int cmd,...//信号量集数组);
//返回:成功返回0,出错返回-1
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}
- 参数
- semid:信号量集ID
- semnum:0表示对所有信号量操作,信号量标号从0开始。
- val:防止获取或设置信号量集中某个信号量的值
- buf:信号量属性指针
- array:防止获取或设置信号量集中所有信号量的值
- cmd
- IPC_STAT:获取信号量的属性,取此队列的semid_ds结构,并放在buf指向的结构中
- IPC_SET:设置属性,按由buf只想的结构中的值,设置与此信号量相关的结构中的字段
- IPC_RMID:删除信号量,从系统中删除该信号量以及信号量上的所有数据。
信号量集操作
#include<sysm.h>
int semop(int semid,struct sembuf *sops,size_t nsops);
//成功返回0,失败返回-1
struct sembuf
{
unsigned short sem_num; //信号量集标号
short sem_op; //操作
short sem_flg; //
}
- 参数
- semid:信号量集ID
- sops:sembuf结构体数组指针
- nsops:第二个参数中结构体数组的长度
- sem_num:信号量集中信号量的编号
- sep_op:正数为v操作,负数为p操作,0表示对共享资源是否已用完的测试
- sem_flg:SEM_UNDO标志,表示进程结束时,相应的操作将被取消,如果设置了该标志,那么在进程没有释放共享资源就退出时,内核将代为释放。
- 用于信号量集中信号量的PV操作
- 可用于进程见的互斥和同步
IPC 进程间通信方式——信号量的更多相关文章
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- IPC 进程间通信方式——共享内存
共享内存 共享内存区域是被多个进程共享的一部分物理内存. 多个进程都可以把共享内存映射到自己的虚拟空间.所有用户空间的进程要操作共享内存,都要将其映射到自己的虚拟空间,通过映射的虚拟内存空间地址去操作 ...
- Linux下进程间通信方式——信号量(Semaphore)
1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...
- IPC 进程间通信方式——消息队列
消息队列 消息队列是内核中的一个链表 用户进程将数据传输到内核后,内核重新添加一些如用户ID.组ID.读写进程的ID和优先级等相关信息后并打包成一个数据包称为消息 允许一个或多个进程往消息队列中读写消 ...
- Linux进程间通信(IPC)之信号量
[Linux]进程间通信(IPC)之信号量详解与测试用例 2017年03月22日 17:28:50 阅读数:2255 学习环境centos6.5 Linux内核2.6 进程间通信概述 1. 进程通信机 ...
- unix进程间通信方式(IPC)
unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...
- Nucleus进程间通信(IPC)方式
版权声明:本文为博主原创文章,未经博主同意不得转载--"http://blog.csdn.net/suipingsp". https://blog.csdn.net/suiping ...
- UNIX:高级环境编程 - 第十五章 IPC:进程间通信
IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方 ...
- 【转】进程间通信方式总结(windows 和linux)
平时看的书很多,了解的也很多,但不喜欢总结,这不昨天面试的时候被问到了进程间通信的方式,因为没有认真总结过,所以昨天答得不是特别好.现在将linux和windows的进程间通信方式好好总结一下. ...
随机推荐
- sql常用到的查询连接
一.内连接(Inner Join) select * from a inner join b on a.name=b.name; 此语句的结果为同时匹配表a和表b的记录集.即内连接取的是两个表的交集. ...
- TIPTOP之分割split函数方法、getIndexOf、subString、replace、临时表创建;
范例(cnmq001): 原:每次查询都把数据全部查询到临时表后再筛选: 现:查询到临时表的时候,增加可行的筛选条件,再二次筛选临时表的数据,进行优化: 1)临时表创建: PRIVATE FUNCTI ...
- Rust 优劣势: v.s. C++ / v.s. Go(持续更新)
Rust 发展速度比 C++ 强很多.如果去翻 open-std 的故纸堆,会发现 C++ 这边有很多人(包括标准委员会的人)提了有用的提案,但后来大多不了了之或经历了非常长的时间才进入标准. > ...
- HashMap—— values() remove方法 containsKey()方法 containsValue()方法
values()方法:看下面的实例,就是把所有的value值封装成一个connection型的数组 Map<Integer,Student> students=new HashMap< ...
- C C语言中 *.c和*.h文件的区别!
一个简单的问题:.c和.h文件的区别学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼:子程序不要定义在 ...
- DisableThreadLibraryCalls与DLLMain死锁
1.首先写个简单的DLL,用来验证 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ...
- Function(Of T) as T 泛型类型多态返回对象的实现
Shared Function ResultT(Of T As result)(msg As String, Optional success As Boolean = False) As T Dim ...
- java实现spark常用算子之ReduceByKey
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...
- 前端imageBuffer设置图片src(后端返回二进制流图片)
参考地址1:前端imageBuffer设置图片src(后端到前端直传buffer) 参考地址2:axios根据流生成图片 本质为buffer转base64 // 获取项目截图 getItemPic() ...
- rabbitmq 连接报错 An unexpected connection driver error occured
转自:https://blog.csdn.net/zht741322694/article/details/82801873 在服务器上安装了一个RabbitMq,并新创建了一个用户授予了管理员角色, ...