开发者社区> 霖枫> 正文

进程间通信(IPC)

简介: UNIX系统IPC就是进程间通讯方式的统称,所有进程间通讯的方式有三种类型,即半双工管道,System V IPC /POSIX IPC和网络进程间通讯。
+关注继续查看

UNIX系统IPC就是进程间通讯方式的统称,所有进程间通讯的方式有三种类型,即半双工管道,System V IPC /POSIX IPC和网络进程间通讯。

   本实验涉及到System V IPC /POSIX IPC类型,System V IPC /POSIX IPC又包括三种进程通信方式,即消息队列、信号量以及共享存储器,实验中我采用了消息队列的方式。

消息队列是一个消息的链表,该表由内核进行维护及存储,通过一个消息的类型来索引指定的数据。消息队列在两个进程间通讯如下图所示:


以下为一读取消息队列实例:

发送方代码:


接收方代码:


读写消息队列的运行结果如下所示:



用消息队列实现的简单聊天程序

代码分析:

每一个SystemV 对象(消息队列,共享内存和信号量)创建时,需要的第一个参数是整数的Key值,
头文件<sys/types.h>把key_t定义为一个整数
 •  System V创建对象时假设进行IPC通讯双方都取了相同的key值.这样将双方关联起来
 •  生成key的方法有三种
–双方直接设置为一个相同的整数为key值
–用IPC_PRIVA让系统自动产生一个key值,
–用ftok函数将一个路径转换为key值
ftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。

Send端代码如下所示:



Receive代码:



整个消息队列通信的实现基本由三个部分构成:

首先是创建消息队列:在程序中使用msgget函数来创建和打开一个队列,每个进程通讯对象都对应一个key参数,我在代码中实现个队列如下:


IPC_CREAT | IPC_EXCL | 0666实现一个权限为0666的消息队列,其中组用户、当前用户以及其他用户拥有读写的权限。在程序最后可以使用system(“ipcs -q”)来查看系统中进程通信的状态。

Msgctl函数可以在队列上做多种操作,其中很有用的操作是删除指定的队列,虽然在代码中没有体现这一操作,但在后面的代码优化中还是有帮助的,具体实现如下:


其中IPC_RMID参数就是执行删除队列操作的。

下面我开始进行读写消息队列的编写,先来看看写操作:为了实现可以多次写入数据,我把写操作放在一个while循环中:


先通过fget函数将写入的数据存入buff中,在通过msgsend函数实现将数据传到队列中去,&pmsg指向一个msgbuf的结构,qid则指定了操作的队列。

读取消息可以使用msgrcv,从队列中读取消息,代码如下:


参数&pmsg指向接收数据的缓冲区,这个buff在qid指定的队列中,其中实现AB两个进程互相通信的关键一个参数时“1”的设置,1代表了消息类型,在send端定义的发送消息类型为1,而在receive端定义的消息类型为2,这样当send端要接收数据时则通过msgrcv函数的type参数就可以接收到receive端发送的数据而不是接收到自己发送的数据。


代码只通过队列的方式实现了简单的聊天通讯功能,send和receive端可以进行一对一的半双工的通讯,由于我只是用了一个队列,所以每次必须先运行send后运行receive,退出时先通过receive发出quit命令给send端,然后send端接收到quit后再执行一次quit命令即可AB进程全部退出,由于最近时间较紧,本实验先做到这里,后面还会进行改进实现功能更加完善的聊天程序。






版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18802 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27975 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22049 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15492 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20103 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14868 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23538 0
+关注
54
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载