微信小程序>新闻>资讯>「Linux进程间通信(消息队列信号量与共享内存)」百家号
「Linux进程间通信(消息队列信号量与共享内存)」百家号-微信小程序

「Linux进程间通信(消息队列信号量与共享内存)」百家号

71

分类:新闻资讯

开发作者: 「Linux进程间通信(消息队列信号量与共享内存)」百家号

发布时间: 2019-04-10 11:20:13

更新时间: 2019-04-10 11:20:13

查看要求: 微信app最新版本

更多信息: 关于「Linux进程间通信(消息队列信号量与共享内存)」百家号

「Linux进程间通信(消息队列信号量与共享内存)」百家号-微信小程序二维码

微信扫码体验

「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序介绍

「Linux进程间通信(消息队列信号量与共享内存)」百家号_作者自评:

如何看待百家号Lite小程序热议话题「Linux进程间通信(消息队列信号量与共享内存)」
写在前面
不得不说,Deadline果真是第一生产力。不过做出来的东西真的是不堪入目,于是又花了一早上重写代码。实验内容
进程通信的邮箱方式由操作系统提供形如send()和receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统本身提供的信箱,分析两者之间存在的异同。
背景知识
消息队列
什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。Linux中如何使用消息队列Linux提供了一系列消息队列的函数接口来让我们方便地使用它来实现进程间的通信。它的用法与其他两个SystemVPIC机制,即信号量和共享内存相似。msgget()函数该函数用来创建和访问一个消息队列。它的原型为:
intmsgget(key_tkey,intmsgflg);
它返回一个以key命名的消息队列的标识符(非零整数),失败时返回-1.msgsnd()函数该函数用来把消息添加到消息队列中。它的原型为:
intmsgsend(intmsgid,constvoid*msg_ptr,size_tmsg_sz,intmsgflg);
如果调用成功,消息数据的一份副本将被放到消息队列中,并返回0,失败时返回-1.msgrcv()函数该函数用来从一个消息队列获取消息,它的原型为:
intmsgrcv(intmsgid,void*msg_ptr,size_tmsg_st,longintmsgtype,intmsgflg);
调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区中,然后删除消息队列中的对应消息。失败时返回-1。msgctl()函数该函数用来控制消息队列,它与共享内存的shmctl函数相似,它的原型为:
intmsgctl(intmsgid,intcommand,structmsgid_ds*buf);
成功时返回0,失败时返回-1.
信号量
什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。Linux的信号量机制Linux提供了一组精心设计的信号量接口来对信号量进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值
进行操作的。它们声明在头文件sys/sem.h中。semget()函数它的作用是创建一个新信号量或取得一个已有信号量,原型为:
intsemget(key_tkey,intnum_sems,intsem_flags);
成功返回一个相应信号标识符(非零),失败返回-1.semop()函数它的作用是改变信号量的值,原型为:
intsemop(intsem_id,structsembuf*sem_opa,size_tnum_sem_ops);semctl()函数该函数用来直接控制信号量信息,它的原型为:
intsemctl(intsem_id,intsem_num,intcommand,...);
共享内存
什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。共享内存的使用与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件sys/shm.h中。shmget()函数该函数用来创建共享内存,它的原型为:
intshmget(key_tkey,size_tsize,intshmflg);
成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.shmat()函数第一次创建完共享内存时,它还不能被任何进程访问,shmat()函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下:
void*shmat(intshm_id,constvoid*shm_addr,intshmflg);
成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.shmdt()函数该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:
intshmdt(constvoid*shmaddr);
调用成功时返回0,失败时返回-1.shmctl()函数与信号量的semctl()函数一样,用来控制共享内存,它的原型如下:
intshmctl(intshm_id,intcommand,structshmid_ds*buf);
参考资料
以上资料全部来源于以下网站:
Linux进程间通信(五):信号量semget()、semop()、semctl()Linux进程间通信(六):共享内存shmget()、shmat()、shmdt()、shmctl()Linux进程间通信(七):消息队列msgget()、msgsend()、msgrcv()、msgctl()实验结果
消息队列信号量+共享内存完整代码
Linux-interProcessCommunication
总结
不足没有图形化界面用信号量和共享内存实现的进程通信只能发送数字消息创建共享内存空间时,设置权限为了省事设置为0666(每个进程可读和可写),应该要设置user只能读而不能写,other只能写而不能读消息队列没有测试msgrcv()函数通过改变msgtype参数来改变接收优先级。>msgtype可以实现一种简单的接收优先级。如果msgtype为0,就获取队列中的第一个消息。如果它的值大于零,将获取具有相同消息类型的第一个信息。如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。...两种方式实现进程间通信的异同异:消息队列不需要信号量来控制同步和互斥问题,并且可以很方便的改变接收优先级,而共享内存则只能简单的接收按时间排序的消息。同:一个进程接收到的消息都和另一个进程发送的相同。心得由于Linux提供的信号量接口函数都是针对一组信号量进行操作的,因此参数中大部分都需要指定对一组中的哪一个信号量进行操作共享内存只存放消息缓存区,至于信箱头的那些值仍然存放在各自进程中。
该话题由百家号作者联智博库「简介:野草烧不尽,春风吹又生」整理发布
更多有关Linux进程间通信(消息队列信号量与共享内存)的话题讨论请关注百家号Lite小程序

「Linux进程间通信(消息队列信号量与共享内存)」百家号_使用指南:

步骤1:微信扫描「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序码即可使用;

步骤2:微信搜索「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序名称即可使用;

步骤3:微信网页访问即速商店-长按识别「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序码即可使用。

「Linux进程间通信(消息队列信号量与共享内存)」百家号_服务声明:

本服务由「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序开发者向微信用户提供,并对本服务信息内容、数据资料及其运营行为等的真实性、合法性及有效性承担全部责任。

"「Linux进程间通信(消息队列信号量与共享内存)」百家号"由开发者"「Linux进程间通信(消息队列信号量与共享内存)」百家号"原创首发于微信小程序商店shop.jisuapp.cn,转载请注明出处。

「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序截图

「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序评分

4.6

共收到5条评价

5星3条

4星2条

3星0条

2星0条

1星0条

「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序评论

请给小程序评分

  • 冋╰憶20132019-05-26 02:04:52

    打开微信就能用,大大简化了使用流程,必须给「Linux进程间通信(消息队列信号量与共享内存)」百家号微信小程序32个赞。

  • ˇ淡淡丶爱2019-05-26 02:04:36

    「Linux进程间通信(消息队列信号量与共享内存)」百家号厉害了,高品质小程序呀

  • 丨Zero丶量版集团2019-05-26 02:02:25

    说该「Linux进程间通信(消息队列信号量与共享内存)」百家号微信小程序满分评价,绝对不是虚的。

  • 被骗其实是一中解脱2019-05-26 02:00:20

    感谢这个「Linux进程间通信(消息队列信号量与共享内存)」百家号微信小程序,在满足我需求的同时解放了我的手机内存!

  • 沵视涐莫如空气般透明丶2019-05-26 02:00:17

    这「Linux进程间通信(消息队列信号量与共享内存)」百家号小程序长得好看,功能又多,还不占内存,很好很强势

提交小程序关注微信

海量浏览,人人体验

提交申请

入驻催审,首页推荐