当前位置: 首页 > news >正文

深圳外贸网站建设工作室163邮箱新用户注册

深圳外贸网站建设工作室,163邮箱新用户注册,共享vps可以做网站吗,一个人在线观看免费高清视频动漫一、消息队列的原理 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立接收含有不同类型值得数据库。 消息实际上是一个数据块,这个数据块是一个结构体,结构体由自己命名。消…

一、消息队列的原理

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立接收含有不同类型值得数据库。

在这里插入图片描述
消息实际上是一个数据块,这个数据块是一个结构体,结构体由自己命名。消息的第一个成员是固定的,它是一个长整型,它代表消息的类型,后面的成员是自己定义的数据。一开始消息队列是空的,可以由一个进程a向消息队列中发送消息,但是如果由另外一个进程b或c去接收消息队列中的消息就会发生阻塞。当一个进程往消息队列中发送消息时,只要这个消息队列没有满,就可以添加进去,如果消息队列满了,就会发生阻塞。当一个进程去接收消息队列中的消息时可以指定消息的类型,当消息队列中没有所指定的消息的类型,进程就会发生阻塞。

1.消息队列与有名管道

消息队列和有名管道有许多相似之处

相同点:

使用消息队列并没有解决我们在使用有名管道时遇到的一些问题,比如管道满时的阻塞问题,在消息队列中同样存在,消息队列满时也会发生阻塞。

不同点:

消息队列相比较管道来说,消息队列少了在打开和关闭管道方面的复杂性。消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与有名管道相比,消息队列独立于发送和接收进程而存在,这消除了在同步有名管道的打开和关闭时会产生的一些困难。

2.消息队列得优缺点:

(1)优点:

①可以通过发送消息来几乎完全避免有名管道得同步和阻塞问题。

②可以用一些方法来提前查看紧急消息。

缺点:

与管道一样,每个数据块都有一个最大长度得限制,系统中所有队列所包含得全部数据块得总长度也有一个上限。Linux系统有两个宏定义MSGMAX和MSGMNB,它们以字节为单位分别定义了一条消息的最大长度和一个队列的最大长度。其它系统中这些宏定义可能会不一样或者不存在。

3.消息队列的生命周期

消息队列的生命周期并不随进程的结束而结束,是随内核持续的。调用消息队列相关的内核的接口,内核帮忙创建,只要自己不主动去删除,就会一直存在,即便进程已经结束,它们也一直会在内核中被维护着。想用的时候还可以继续用,在程序最后不使用的情况下把它删除。删除的方法有3种,关机、调用相关函数删除和在命令行手动删除。

信号量、共享内存的生命周期也是如此。

二、消息队列相关接口函数

1.msgget() 创建消息队列

创建或者获取一个消息队列的ID

 int msgget(key_t key, int msqflg);   

参数解释:
key:“房间密码”
msqflg:创建消息队列的方式,同时设置权限
返回值:成功返回消息队列id,失败返回 -1

权限的设置规则:

IPC_CREAT:可以单独使用,如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列的ID;如果已经存在,则沿用已有的消息队列,函数返回值是已有的消息队列的ID。

IPC_EXCL:无法单独使用,要配合IPC_CREAT使用,即 IPC_CREAT | IPC_EXCL,表示如果消息队列不存在,则重新开辟,函数返回值是新开辟的消息队列ID;如果已经存在,则报错。

IPC_CREAT | IPC_EXCL | 0664:开辟消息队列的同时,设置消息队列的访问权限

2.msgsnd() 向消息队列中添加一条消息

该函数的作用是向消息队列中添加一条消息。

int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);

参数解释:

msgid:消息队列ID,即msgget函数的返回值
msgp: 消息缓冲区的地址,也就是你要向消息队列中添加的消息,需要满足一定的格式。消息格式如下:

  struct msgbuf  
{  long  mtype;   // 消息类型, 必须大于0  char  mtext[1]; //  消息数据  //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};  

msgsz:指定mtext中有效数据的长度。这里的消息长度指的是上面这个结构体中buf成员所占字节数。
msgflag:表示发送消息的方式。一般设置为0。也可以设置IPC_NOWAIT。可选值及其含义如下:

在这里插入图片描述
返回值:成功返回0,失败返回-1

3.msgrcv())接收一条消息

该函数的作用是从消息队列的队头取出一条消息。

ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);   

参数解释:

msgid:消息队列id
msgp:输出型参数,表示消息缓冲区的地址。也就是你要把取出来的消息放在哪,同样需要使用指定格式。数据格式和msgsnd函数所要添加的消息的格式一样,如下:

  struct msgbuf  
{  long  mtype;   // 消息类型, 必须大于0  char  mtext[1]; //  消息数据  //(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};  

size:用于存放接收到的消息数据的缓冲区大小。
msgtype:选择想要取出的消息类型(虽然叫做消息队列,但是不一定就是取出队头元素,也可以是取出具有相同消息类型中的第一个消息)。主要分为以下三种情况:

在这里插入图片描述

msgtype < 0的具体解释:假设消息队列里的消息类型有 1、3、4、5 四种类型的消息,如果msgtype = -4,绝对值是4,那就需要取出消息类型小于等于4的所有消息,因此,取出消息的消息类型必须是1、3、4类型。

msgflag:表示接收消息的方式。一般设置为0,也可以设置IPC_NOWAIT等,可选值如下:

在这里插入图片描述
返回值: msgrcv()成功返回mtext中接收到的消息数据的长度, 失败返回-1。

4.msgctl()一般用来销毁消息队列

该函数的作用是控制消息队列,一般用来销毁消息队列。

int msgctl(int msqid, int cmd, struct msqid_ds *buf);  

参数解释:

msgid:消息队列id
cmd:对消息队列执行的具体操作,如拷贝、查询、销毁等。可选值如下:

在这里插入图片描述

buf:消息队列缓冲区。比如 cmd 为IPC_STAT时,会把消息队列的相关信息拷贝到该缓冲区中。
返回值:msgctl()成功返回0,失败返回-1

http://www.yayakq.cn/news/223220/

相关文章:

  • 佛山规划建设局网站wordpress 建购物网站
  • 做网站吸引客户网页升级访问中未满十八岁
  • 摄影摄像网站建设vps没问题访问不了网站
  • 公司网站制作重庆极速网站建设
  • 主机屋的免费空间怎么上传网站制作一个私人网站怎么申请域名
  • 免费建站赚钱申请免费网站主页空间
  • 网站速度慢的原因旅行社做境外购物网站
  • 深圳建站模板公司国内好的网站建设
  • 营销网站搭建建议苏州网站建设丶好先生科技
  • 长春网站建设那家好网站建设上海诏业
  • 朝阳区建设工作办公室网站图片外链生成
  • 网站设计公司费用好的网站搭建公司
  • 东莞网站优化关键词推广开发公司组织架构设计
  • 广州做英文网站的公司网页与网站设计工作内容
  • 保定网站排名优化采购网官网
  • hs网站推广大连坐网站
  • 广州网站优化排名推广二手房网站建设书
  • 做商城网站需要多少钱电商设计外包
  • 做国内电影网站赚钱不什么网站可以做试卷
  • 建设网站最便宜多少钱手机网站源码怎么打开
  • 江门网站制作网站青岛室内设计公司排名
  • 做化妆招生宣传在那些网站可以做wordpress foot增加js
  • 奉化区城乡建设局网站网站死链接提交
  • 广州网站建设设计厂家网站里的图片是怎么做的
  • 南通市住房和城乡建设厅网站长沙网站建设网站
  • 成全视频免费观看汉中网站seo
  • 网站建设制作设计公司佛山常熟seo网站优化软件
  • 保健品网站源码软件开发工程师考核指标
  • 网站能不能一边用 一边备案wordpress 中文 字体大小
  • 徐州html5响应式网站建设ui界面设计图