Linux基础内容(21)—— 进程消息队列和信号量

Linux基础内容(20)—— 共享内存_哈里沃克的博客-CSDN博客

目录

1.消息队列

1.定义

2.操作

2.信号量

1.定义

2.细节

3.延申

4.操作

3.IPC的特点共性


1.消息队列

1.定义

定义:是操作系统提供的内核级队列

2.操作

msgget:获取消息队列

 key:操作系统层面创造消息队列

magflg:与共享内存一样,表示哪种方式创造

IPC_CREAT -- 指定的共享内存,不存在,创建;存在,共享内存标志返回

IPC_EXCL -- 无法单独使用;只有当 IPC_CREAT|IPC_EXCL 同时使用,如果不存在,创建,如果存在,出错返回

return:返回一个消息队列

msgctl:设置消息队列,可得到属性,或者退出。

msgsnd:发送消息

msqid:指定的消息队列名

msgp:发送的内容

msgsz:发送内容的大小

 msgrcv:读取消息

 

 查看当前存在的消息队列

2.信号量

查看信号量 

1.定义

本质:是一个计数器,通常用来表示公共资源中资源数量的多少问题

公共资源:同时被多个进程访问的资源

公共资源被利用分为两类:1.整体使用 2.划分为一部分使用

在进程大部分都是独立的,那么其实只有少部分公共资源

2.细节

注意:之所以需要公共资源,其实是为了满足进程间通信的目的,由于每一个进程都是独立的,所以必须有一块公共资源能让两个需要互相通信的进程看到,这样就达到了通信的目的。不过此时的公共资源是有一定问题的。因为此时我们的公共资源是没有做任何保护的,那么也就意味着如果一个进程还没有完全把数据输入到公共资源里,另外一个就已经读了,那么另外一个读到的资源就是不完整的。那么由此能知道:没有被保护的公共资源存在着数据不一致的问题。

那么将公共资源进行保护,该公共资源被称为临界资源。

进程通过对应的代码访问临界资源被称为临界区。

如何保护?

互斥和同步都能实现保护公共资源。

原子性:事情要么不做要么做完,只有两态的情况。

3.延申

1.信号量是计数器表示当前进程公共资源数的多少的,其实它需要被多个进程能看到,使用信号量也是一种公共资源。

2.为什么需要信号量?共享空间中,需要分配不同的公共资源划分区域。进程访问资源的一部分,需要先申请信号量,随后得到一个与该区域对应的信号量。这样就保护了临界资源。不过信号量也是一种公共资源,那么为了保护公共资源,信号量本身也需要被保护起来。信号量内部的加减操作由于被保护,所以具有原子性。

3.PV操作:预定公共资源使得信号量--为P操作;预定公共资源使得信号量++为V操作

4.信号量值为1:那么只有两种状态,用于互斥功能

4.操作

1.semget:申请信号量 

nsems:信号量的个数

2.semctl:信号量的查看信息和删除

3.semop: PV操作

 sops:

3.IPC的特点共性

1.其实我们根据共享内存,消息队列和信号量能知道,这些进程通信手段除了使得进程看到同一份资源所以开辟一块空间,作为内核级的数据,当然需要进行先描述后组织。

2.不过当我们观察不同通信描述的属性时,发现他们的接口调用都是XXXctl。并且其中是结构体也十分相似,并且IPC属性的结构体的第一个属性都是key。其实现就相当于C++的“多态”,对于不同的通信方式传入的数据不同,会根据类型强转结构体,这样就能方便得到属性的操作了。

猜你喜欢

转载自blog.csdn.net/m0_63488627/article/details/130770830