进程通信的概念

进程数据空间是相互独立的,不能相互访问的。但某些情况下进程之间需要互相通信,来完成系统的某项功能或交换数据。

进程通信的场景

1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。

2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如通知进程退出)。

5)进程控制:有些进程希望控制另一个进程的运行。

进程通信的方式

1、进程通信的方式

1)无名管道(pipe)及有名管道(named pipe):无名管道可用于具有父进程和子进程之间的通信。有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

2)信号(signal):信号用于通知接受进程有某种事件发生。

3)消息队列(message):消息队列是消息的链接表,进程可以向队列中添加消息,其它的进程则可以读走队列中的消息。

4)共享内存:使得多个进程可以访问同一块内存空间。

5)信号灯(semaphore):也叫信号量,主要作为进程之间对共享资源加锁的手段。

6)套接字(socket):可用于不同机器之间的进程间通信。

2、应用经验

管道和消息队列:太过时了,实在没什么应用价值,了解一下即可。

信号灯(semaphore):我有十年没用过了,可能会有用,也是了解一下即可,不必深入学习。

信号(signal):在信号章节中已详细介绍。

套接字(socket):在TCP通讯章节中介绍。

共享内存:应用场景不多,但还是有,本章节将介绍它。

共享内存和信号灯的江湖地位本来是很高的,但是,随着网络带宽的增加和内存数据库技术的发展,共享内存的应用场景越来越少。但是,对于大型数据库系统来说,共享内存和信号灯仍极其重要。

socket可以用于不同机器之间的进程通信,完全可以代替只能在同一机器的进程通信的管道和消息队列。

共享内存的概念

共享内存就是允许多个进程访问同一个内存空间。共享内存是在多个进程之间共享和传递数据最高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。

共享内存并未提供锁机制,也就是说,在某一个进程对共享内存的进行读写的时候,不会阻止其它的进程对它的读写。如果要对共享内存的读写加锁,我们可以用共享内存自身的标记或信号灯。对普通程序员来说,对共享内存加锁的应用场景并不多见。

共享内存的操作

Linux中提供了一组函数用于操作共享内存,它们声明在头文件 sys/shm.h 中。

1、shmget函数

shmget函数用来获取或创建共享内存,它的声明为:

int shmget(key_t key, size_t size, int shmflg);

参数key是共享内存的键值,是一个整数,typedef unsigned int key_t,是共享内存在系统中的编号,不同共享内存的编号不能相同,这一点由程序员保证。key用十六进制表示比较好。

参数size是待创建的共享内存的大小,以字节为单位。

参数shmflg是共享内存的访问权限,与文件的权限一样,0666|IPC_CREAT表示全部用户对它可读写,如果共享内存不存在,就创建一个共享内存。

2、shmat函数

把共享内存连接到当前进程的地址空间。它的声明如下:

void *shmat(int shm_id, const void *shm_addr, int shmflg);

参数,shm_id是由shmget函数返回的共享内存标识。

参数shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。

参数shm_flg是一组标志位,通常为0。

调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.

3、shmdt函数

该函数用于将共享内存从当前进程中分离,相当于shmat函数的反操作。它的声明如下:

int shmdt(const void *shmaddr);

参数shmaddr是shmat函数返回的地址。

调用成功时返回0,失败时返回-1.

4、shmctl函数

删除共享内存,它的声明如下:

int shmctl(int shm_id, int command, struct shmid_ds *buf);

参数shm_id是shmget函数返回的共享内存标识符。

参数command填IPC_RMID。

参数buf填0。

解释一下,shmctl是控制共享内存的函数,其功能不只是删除共享内容,但其它的功能没什么用,所以不介绍了。

注意,用root创建的共享内存,不管创建的权限是什么,普通用户无法删除。

5、示例程序(book255.cpp)

       运行结果

注意,程序第一次运行的时候,共享内存未创建,所以第一次运行程序的时候,共享内存中的内容为空。之后程序每次运行都能获取到上一次程序运行写入的内容。

6、两个共享内存的操作命令

用ipcs -m可以查看当前用户有读限权的共享内存,内容有键值(key),共享内存编号(shmid),创建者(owner),权限(perms),大小(bytes)。

用ipcrm -m 共享内存编号,可以手工删除共享内存,如下:

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net)

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

Linux进程间通信的方法和示例相关推荐

  1. PHP下操作Linux消息队列完成进程间通信的方法

    2019独角兽企业重金招聘Python工程师标准>>> 来源:http://www.jb51.net/article/24353.htm 关于Linux系统进程通信的概念及实现可查看 ...

  2. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  3. Linux进程间通信--消息队列(Message queuing)

    今天我们来谈一谈Linux进程间通信的方式之一消息队列 我们先来看看关于消息队列的定义: 1.消息队列是消息的链表,存放在内核中并由消息队列标识符表示. 2.消息队列提供了一个从一个进程向另一个进程发 ...

  4. Linux应用开发【第四章】Linux进程间通信应用开发

    文章目录 4 Linux进程间通信应用开发 4.1 初识进程 4.1.1 进程的概念 4.1.1.1 程序 4.1.1.2 进程 4.1.1.3 进程和程序的联系 4.1.1.4 进程和程序的区别 4 ...

  5. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

    http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...

  6. linux进程间通信方式及比较

    进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信号(sig ...

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

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  8. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()...

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  9. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

最新文章

  1. ue4 导出模型_UE4构建光照后模型变黑,二套UV解决办法
  2. 【渝粤题库】陕西师范大学202081 管理学 作业 (专升本、高起本、高起专)
  3. 加快FineReport报表设计的几个心得体会
  4. java class 内容查看_015-JVM-使用javap查看class文件内容
  5. 专业级频谱测试软件,手机频谱仪测试软件
  6. css各种字体英文名称
  7. 超级记忆/图像数字记忆 110位数字图像转换表 21-30
  8. 显卡测试软件硬盘版怎么安装,显卡检测软件(Alexander)
  9. 游戏感:虚拟感觉的游戏设计师指南——第十九章 游戏感的未来
  10. EXCEL-批量下拉填充
  11. CentOS 下安装Mplayer播放器(转载)
  12. LTP(Linux Test Project)学习(五)——LTP代码学习
  13. 暗色调,调出紫红色的暗调晨曦照片效果(转)
  14. React SSR: 基于 express 自构建 SSR 服务端渲染
  15. KMeans算法的Mapreduce实现
  16. 【AI智能写作】怎样写一篇高质量热门火爆的技术文章?
  17. 微信小程序加水印(含代码效果图)
  18. 光猫路由器与交换机的连接方式
  19. android开发炫酷背景图片,12 个炫酷背景特效库
  20. 无法显示页面,因为发生内部服务器错误。

热门文章

  1. 微课|玩转Python轻松过二级(1.1节):Python命令式编程与函数式编程模式
  2. 微课|中学生可以这样学Python(例5.6、例5.7):集合应用
  3. 全国高校“数据科学与大数据技术”专业教学研讨会
  4. 从入门到精通:卷积神经网络初学者指南
  5. ssd颗粒查看工具_SSD又降价了,但是使用前一定要做这几件事
  6. 区块链需要学习哪些东西_区块链主要学习哪些知识?
  7. 优秀ppt作品范例_毕业论文答辩ppt模板优秀范例
  8. 河北省计算机2018单招试题答案,2018年河北省普通高职单招考试十类和高职单招对口电子电工类、计算机类联考命题、考试与评卷...
  9. c++ 输出string_来讲讲Java中String 类的知识点
  10. 华为媒体服务器在哪个文件夹,plex媒体服务器地址