信号量

  • 本质上是共享资源的数目,用来控制对共享资源的访问。
  • 用于进程间的互斥和同步
  • 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对多对信号量一次性操作。对信号量集中所有的操作可以要求全部成功,也可以部分成功
  • 二元信号量(信号灯)值为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 进程间通信方式——信号量的更多相关文章

  1. IPC 进程间通信方式——管道

    进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...

  2. IPC 进程间通信方式——共享内存

    共享内存 共享内存区域是被多个进程共享的一部分物理内存. 多个进程都可以把共享内存映射到自己的虚拟空间.所有用户空间的进程要操作共享内存,都要将其映射到自己的虚拟空间,通过映射的虚拟内存空间地址去操作 ...

  3. Linux下进程间通信方式——信号量(Semaphore)

    1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...

  4. IPC 进程间通信方式——消息队列

    消息队列 消息队列是内核中的一个链表 用户进程将数据传输到内核后,内核重新添加一些如用户ID.组ID.读写进程的ID和优先级等相关信息后并打包成一个数据包称为消息 允许一个或多个进程往消息队列中读写消 ...

  5. Linux进程间通信(IPC)之信号量

    [Linux]进程间通信(IPC)之信号量详解与测试用例 2017年03月22日 17:28:50 阅读数:2255 学习环境centos6.5 Linux内核2.6 进程间通信概述 1. 进程通信机 ...

  6. unix进程间通信方式(IPC)

    unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...

  7. Nucleus进程间通信(IPC)方式

    版权声明:本文为博主原创文章,未经博主同意不得转载--"http://blog.csdn.net/suipingsp". https://blog.csdn.net/suiping ...

  8. UNIX:高级环境编程 - 第十五章 IPC:进程间通信

    IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方 ...

  9. 【转】进程间通信方式总结(windows 和linux)

    平时看的书很多,了解的也很多,但不喜欢总结,这不昨天面试的时候被问到了进程间通信的方式,因为没有认真总结过,所以昨天答得不是特别好.现在将linux和windows的进程间通信方式好好总结一下.    ...

随机推荐

  1. sql常用到的查询连接

    一.内连接(Inner Join) select * from a inner join b on a.name=b.name; 此语句的结果为同时匹配表a和表b的记录集.即内连接取的是两个表的交集. ...

  2. TIPTOP之分割split函数方法、getIndexOf、subString、replace、临时表创建;

    范例(cnmq001): 原:每次查询都把数据全部查询到临时表后再筛选: 现:查询到临时表的时候,增加可行的筛选条件,再二次筛选临时表的数据,进行优化: 1)临时表创建: PRIVATE FUNCTI ...

  3. Rust 优劣势: v.s. C++ / v.s. Go(持续更新)

    Rust 发展速度比 C++ 强很多.如果去翻 open-std 的故纸堆,会发现 C++ 这边有很多人(包括标准委员会的人)提了有用的提案,但后来大多不了了之或经历了非常长的时间才进入标准. > ...

  4. HashMap—— values() remove方法 containsKey()方法 containsValue()方法

    values()方法:看下面的实例,就是把所有的value值封装成一个connection型的数组 Map<Integer,Student> students=new HashMap< ...

  5. C C语言中 *.c和*.h文件的区别!

    一个简单的问题:.c和.h文件的区别学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼:子程序不要定义在 ...

  6. DisableThreadLibraryCalls与DLLMain死锁

    1.首先写个简单的DLL,用来验证 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ...

  7. Function(Of T) as T 泛型类型多态返回对象的实现

    Shared Function ResultT(Of T As result)(msg As String, Optional success As Boolean = False) As T Dim ...

  8. java实现spark常用算子之ReduceByKey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  9. 前端imageBuffer设置图片src(后端返回二进制流图片)

    参考地址1:前端imageBuffer设置图片src(后端到前端直传buffer) 参考地址2:axios根据流生成图片 本质为buffer转base64 // 获取项目截图 getItemPic() ...

  10. rabbitmq 连接报错 An unexpected connection driver error occured

    转自:https://blog.csdn.net/zht741322694/article/details/82801873 在服务器上安装了一个RabbitMq,并新创建了一个用户授予了管理员角色, ...