博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 进程间通信(一)
阅读量:6795 次
发布时间:2019-06-26

本文共 1844 字,大约阅读时间需要 6 分钟。

 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的传递,因此需要进程间数据传递、同步与异步的机制。

分类

  • 统一主机间进程通信
    • Unix进程间通信方式
      • 无名通道
      • 有名通道
      • 信号
    • System V进程间通信方式
      • 信号量
      • 消息队列
      • 共享内存
  • 不同主机间进程通信
      • RPC
      • Socket

消息队列IPC

简单介绍下,所有相关的API函数:

API函数 用途
msgget   创建一个新的消息队列       
  获取消息队列ID
msgsnd        向消息队列发送消息
msgrcv 从消息队列接受消息
msgctl 获得消息队列的信息
  设置消息队列的信息
  删除消息队列

函数原型如下:

// 函数原型#include 
int msgget( key_t key, int msgflag);/*key为消息队列的描述符msgflag是一个设置选项,可以设置权限返回值为消息队列ID*/int msgctl( int msgid, int cmd, struct msqid_ds *buf);/*msgid是msgget的返回值cmd :IPC_STAT 获取消息队列当前的状态信息,保存到buf指向的空间 IPC_SET 设置消息队列的属性 IPC_RMID 从内核中删除msgid标识的消息队列*/int msgsnd( int msgid, struct msgbuf *msgp, size_t msgsz, int msgflag);/*msgid为消息队列IDmsgbuf 指向要发送的消息msgsize 消息的大小msgflag 操作标志位*/int msgrcv(int msgid, struct msgbuf *msgbuf, size_t msgsize, long int msgtype, int msgflag);/*msgtype用来指定要接收的消息,分三种情况:等于 0 返回消息队列中的第一个消息大于0 返回消息队列中类型为msgtype的第一个消息小于0 返回消息队列中类型值小于等于msgtype绝对值的消息中类型值最小的第一条消息*/

例子:

 
创建消息队列
 
配置消息队列
 
向消息队列发送消息
 
从消息队列读取消息

共享内存

  使用消息队列时,一个进程要向队列中写入消息,这要引起从用户地址空间的一次复制,当另外一个进程要从消息队列中读取消息时,又要进行一次从内核空间向用户空间的一次复制。而共享内存的优点就是完全省去了这些复制操作。

  简单介绍下API函数:

API函数 用途                                                                                             
shmget             创建一个新的共享内存区段
  取得一个已经创建的共享内存区段的描述符
shmctl 取得一个共享内存区段的信息
  为一个共享内存区段设置特定的信息
  删除一个共享内存区段
shmat 挂接一个共享内存区段
shmdt 与一个共享内存区段分离

   函数原型如下:

//函数原型#include 
#include
#include
int shmget( key_t key, size_t size, int shmflag );/*key为描述符size为共享内存区段的大小shmflag为指令和权限设置*/int shmctl( int shmid, int cmd, struct shmid_ds *buf );/*shmid指共享内存IDcmd为指令*/void *shmat( int shmid, const void *shmaddr, int shmflag);/*shmaddr指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置shmflg SHM_RDONLY:为只读模式,其他为读写模式*/int shmdt( const void *shmaddr );

例子:

 
创建共享内存
 
取得共享内存
 
写入共享内存
 
读取共享内存
 
删除共享内存

 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/3213738.html,如需转载请自行联系原作者

你可能感兴趣的文章
springCloud分布式事务实战(四)分布式事务处理器的下载,编译和运行
查看>>
给PDF文件添加页码的方法
查看>>
DOS、DDOS、CC等完整解决方案
查看>>
国家级期刊投稿价格
查看>>
SaCa DataViz 企业版 | 高性能大数据分析引擎
查看>>
MySQL高可用实现:主从结构下ProxySQL中的读写分离
查看>>
oracle实例侦听
查看>>
oracle物理结构(一)--控制文件
查看>>
软件工程学概述(二)
查看>>
Linux 部署两个版本的Mysql
查看>>
ThinkPHP 开发环境搭建
查看>>
tomcat设置内存大小及默认目录
查看>>
Horizon Workspace 快速部署指南四(配置Workspace应用模块)
查看>>
Lambda表达式 JOIN 多参数写法
查看>>
vs2008.net多语言实现方法
查看>>
jQuery-可以编辑的表格
查看>>
mysql中kill掉所有锁表的进程
查看>>
php编译安装、加速及与nginx的整合
查看>>
Linux系统调优:提高磁盘吞吐量
查看>>
Hibernate5-一对多双向关联-左外连接-HQL
查看>>