消息队列和信号量

什么是消息队列

(1)消息队列提供了一种从一个进程向另一个进程发送数据块的方法。

(2)消息队列的生命周期不是随进程,而是随内核。

(3)消息队列属于操作系统。

2.消息队列的函数

(1.)创建新消息队列或取得已存在消息队列
原型:int msgget(key_t key, int msgflg);
参数:
key:可以认为是一个端口号,也可以由函数ftok生成。
msgflg:
IPC_CREAT 如果IPC不存在,则创建一个IPC资源,否则打开操作。
IPC_EXCL:单独使用没有意义。如果将IPC_CREAT和IPC_EXCL标志一起使,不存在将会创建,存在则会出错返回。
(2.)向队列读/写消息
原型:
msgrcv从队列中取用消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
msgsnd将数据放到消息队列中:int msgsnd(int msqid, const void *msgp, size_t msgsz, int         msgflg);
参数:
msqid:消息队列的标识码
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可
定义的通用结构,形态如下:
struct msgstru{
long mtype; //大于0

char mtext[用户指定小];
};
msgsz:消息的小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常
数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而
会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定
错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取
阻塞等待的处理模式。
(3.)设置消息队列属性
原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作
: IPC_STAT , IPC_SET , IPC_RMID
IPC_STAT : 该命令用来获取消息队列对应的 msqid_ds 数据结构,并将其保存到 buf 指
定的地址空间。
IPC_SET : 该命令用来设置消息队列的属性,要设置的属性存储在buf中。
IPC_RMID : 从内核中删除 msqid 标识的消息队列。

写一个消息队列程序:

comm.h

comm.c

client.c

server.c

效果图:

3.信号量:信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的
通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号
量在此过程中负责数据操作的互斥、同步等功能。当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。当进程不再使用一个信号量控制的共享资源时,信号量的值+1,对信号量的值进行的增减操作均为原子操作,这是由于信号量主要的作用是维护资源的互斥或多进程的同步访问。而在信号量的创建及初始化上,不能保证操作均为原子性。

4.为什么使用信号量

为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访
问机制,让一个临界区同一时间只有一个线程在访问它, 也就是说信号量是用来调协进程
对共享资源的访问的。其中共享内存的使用就要用到信号量。

5.相关函数

信号量的相关函数与消息队列的函数都比较相似,在进行p,v运算时,用到结构体sembuf
struct sembuf

{
unsigned short sem_num ;//信号量的总数相当于从0开始的一个数组,这里的_num表示总个数
short sem_op ;//-1:p运算  1:v运算
short sem_flg = 0;//通常为SEM_UNDO,使操作系统跟踪信号,并在进程没有释放该信号量而终止时,操作系统释放信号量

};

6.信号量工作原理

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂
起,就给它加1.

时间: 2024-10-19 16:44:17

消息队列和信号量的相关文章

消息队列、信号量、共享存储

消息队列.信号量.共享存储是IPC进程间通信的三种形式,它们功能不同,但有一些相似点,下面先介绍它们相类似的特征,然后再逐一说明. 1.相似点 每个内核中的IPC结构(消息队列.信号量.共享存储)都用一个非负整数的标识符加以引用,与文件描述符不同,当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大正直,然后又回转到0.标识符是IPC对象的内部名,还有一个外部名称为键,数据类型是key_t,用于多个合作进程能够在同一IPC对象上会合,键由内核转换成标识

进程间通信IPC:消息队列,信号量,共享内存

2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队列,信号量,共享内存. ipcs 查看ip对象共享内存,信号量,消息队列等信息ipcrm 删除一个IP对象 Linux为用户提供了完善的,强大的网络功能完善的内置网络:其他操作系统不包含如此紧密的和内核结合在一起的网络部分 共享内存标示符的获取有两种方法:ftok(pathname,id)另一个是K

IPC通信之消息队列、信号量和共享内存

有三种IPC我们称作XSI IPC,即消息队列,信号量以及共享存储器.XSI IPC源自System V的IPC功能.由于XSI IPC不使用文件系统的命名空间,而是构造了它们自己的名字空间,为此常常受到批评. 相似之处:每个内核中的IPC结构都用一个非负整数的标识符加以引用.例如对一个消息队列发送或取消息,只需要知道其队列标识符.与文件标识符不同,IPC标识符不是小的整数,当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整形数的最大正值,然后又回转到0. 标

Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)

有3种称作XSI IPC的IPC:消息队列.信号量.共享存储.这种类型的IPC有如下共同的特性. 每个内核中的IPC都用一个非负整数标志.标识符是IPC对象的内部名称,为了使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案.因此,将每个IPC对象都与一个键相关联,将这个键(key)作为该对象的外部名.这个键的数据类型是key_t,通常在头文件<sys/types.h>中被定义为长整型,该键由内核变换成标识符. 有3种方式可以使客户进程和服务器进程在同一IPC结构上汇聚: (1)

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在

Freertos-事件标志组,消息队列,信号量,二值信号量,互斥信号量

任务间的通信和同步机制  在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题: 1.使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.2.使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.3.使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题. 事件标志组:事件标志组是实现多任务同步的有效机制之一. 每创建一

UCOSII笔记---信号量、邮箱、消息队列、信号量集、软件定时器

一.接收邮箱函数的参数:timeout表示的是滴答定时器的节拍数,比如设定5ms为一个节拍,超时为100ms,则timeout=20. void *OSMboxPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr) 原文地址:https://www.cnblogs.com/leo0621/p/8421501.html

ucos2 事件 任务的通讯和同步 信号量 互斥量 消息邮箱 消息队列

这会想了想,在复习资料后,最后再做个核心代码分析 ucos中使用信号量.消息邮箱.消息队列,这些数据结构来作为通信中间媒介.这些数据结构会影响任务的程序流程,因此也叫做事件. 一.信号量 是进行任务通信的最基本事件 二值信号可以实现共享资源的独占,也叫互斥信号量. 注意:使用信号量的时候要,高优先级的任务等待接受信号量的时候,高优先级的任务在等待接受信号量的时候,如果低优先级的任务没有释放信号量,那就会一直等待下去,那低优先级的任务就没有机会运行了,系统就出现死机的状况了.   解决方法:加个超

System V IPC(1)-消息队列

一.概述                                                    System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&T System v UNIX上面,并遵循XSI标准,有时候也被称为XSI IPC. 本文先探讨消息队列: 1.消息队列允许进程以消息的形式交换数据.读写都是针对整条消息,不能读写消息的一部分,不像管道那样可以以流的形式读写任意字节. 2.消息队列除了包含数据外,还有一个整数来表示该消息的类型.读取消息