一、管道

二、 信号

三、共享内存

四、消息队列

五、信号量

进程间的通信可分为 传统unix通信方式 和 System V通信方式 。

传统unix通信方式有两大类:管道和信号。其中管道又细分为:有名管道和无名管道。

无名管道:

无名管道的特点:

  • 只能用于具有亲缘关系间的通信。【父子进程 或 兄弟进程】
  • 半双工通信。【只能由一方发送,另一方接收】
  • 通信端口固定。【fd[0]:读管道 ,fd[1]:写管道】
  • 管道也是一种特殊的文件,对于它的读写,也可以使用普通的read(),write()函数。
  • 管道不属于任何文件系统,只存在于内存中。
无名管道的创建

无名管道是基于 文件描述符 的通信方式,当一个管道被建立时,它会创建两个文件描述符:fd[0]、fd[1].
fd[0]:读文件描述符,用于固定读管道
fd[1]:写文件描述符,用于固定写管道

无名管道的相关函数

1:pipe()函数.

头文件:#include<unistd.h>
函数名:pipe
参数:int  pipefd[]  :包含两个元素的整型数组,存 放管道对应的文件描述符
返回值:成功--> 0   失败--> -1int  pipe(int  pipefd[]);

  pipe函数创建的管道两端处于同一个进程中。由于管道主要是用于不同进程间的通信,所以首先会fork()一个子进程,该子进程会继承父进程所创建的管道。此时父子进程就都拥有了一个管道,所以会产生两个fd[0],fd[1]。
  根据需要,若是父进程发消息,子进程收消息。那么久关闭父进程的fd[1],关闭子进程的fd[0]。此时父进程就只有fd[0],子进程也就只有fd[1]了。他们俩就能通过无名管道来进行单向通信。

同理,若是需要子进程发送数据,父进程接收数据,就关闭对应的文件描述符即可。

举个栗子

注意事项:

  • 只有管道的读端存在时,向管道内写入数据才有意义。否则,向管道内写入的数据的进程会收到内核传来的SIGPIPE信号。【通常为Broken Pipe(管道破裂) 错误】
  • 向管道内写入数据时,Linux不保证写入的原子性,管道缓冲区只要有空间,写进程就会向管道写入数据;若管道已满,则写操作会阻塞等待
  • 父子进程在运行时,他们的先后次序不能保证。 为确保父子进程已经关闭了相应的文件描述符,可以在两个进程中调用 sleep()函数
【附】上述例子的源码:
#include<stdio.h>
#include<unistd.h>
#include<string.h>int main(void)
{pid_t pid = -1;int pipefd[2];//创建无名管道if(0 > pipe(pipefd)){perror("pipe error!\n");return -1;}puts("pipe success!");/*pipe[0]读端 , pipe[1]写端*/pid = fork(); //创建子进程//判断是否创建成功if(0 > pid)     //pid错误{perror("fork error!\n");return -1;}else if(0 < pid){//父进程 发  子进程 收close(pipefd[0]);    //关闭父进程的读端fd[0]//发送数据char buf[20] = {0};   //从键盘输入小于20的字符串gets(buf , sizeof(buf) , stdin);//将获得的字符串通过管道传递给子进程(pipefd[1]是子进程的接收端)write(pipefd[1] , buf , strlen(buf));//关闭父进程的写文件描述符close(pipefd[1]);}else if(0 == pid){//子进程close(pipefd[1]);    //关闭子进程的写端fd[1]//接收数据char buf1[20] = {0};read(pipefd[0] , buf1 , sizeof(buf1));printf("read data : %s\n" , buf1);//关闭读端close(pipefd[0]);}return 0;
}

未完待续……

Linux进程间通信的五种方式相关推荐

  1. 【操作系统】进程间通信的五种方式

    引言 1.进程对白:管道.记名管道.套接字 1.管道 2.虫洞:套接字 3.信号 4.信号旗语:信号量 5.进程拥抱:共享内存 引言 进程作为人类的发明,自然免不了脱离人类的习性,也有通信需求.如果进 ...

  2. Linux进程间通信的几种方式总结-——linux内核剖析

    进程间通信概述 Linux内核通信相关视频讲解:Linux内核,进程间通信组件的实现 linux内核,进程调度器的实现,内核源码分析 进程通信的目的 传输数据 一个进程须要将它的数据发送给还有一个进程 ...

  3. 进程间通信的五种方式

    进程间通信的意思就是在不同进程之间传递信息.它是一组编程接口,让程序员协调不同进程,使能够相互传递消息. IPC目的 1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆 ...

  4. linux 最快的,五种方式装Linux哪种最快

    mask宇 于 2012-05-20 00:46:44发表: 个人觉得硬盘的传输速率更快 所以悬着硬盘. Hoo_h 于 2012-05-20 00:18:54发表: 想尝试硬盘安装,用过光盘和U盘 ...

  5. Linux 下的五种 IO 模型

    Linux 下的五种 IO 模型 来源:decaywood's Blog 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2 ...

  6. 聊聊 Linux 中的五种 IO 模型

    聊聊 Linux 中的五种 IO 模型 2016/04/21 · IT技术 · 8 评论 · iO, 同步, 异步, 阻塞, 非阻塞 分享到:0 本文作者: 伯乐在线 - 陶邦仁 .未经作者许可,禁止 ...

  7. android如何绑定事件,Android_安卓为按钮控件绑定事件的五种方式

    一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...

  8. android中进程间通信的几种方式

    进程间通信(IPC)方式 使用Bundle 使用文件共享 使用Messenger 使用AIDL 使用COntentProvider 使用Socket 一.使用Bundle 我们都知道Android中三 ...

  9. java中读取properties文件内容五种方式

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

最新文章

  1. ASP.NET Core 跨平台图形验证码实现
  2. 测试jdbc连mysql数据库_java连接mysql数据库及测试是否连接成功的方法
  3. 应用开发框架之——根据数据表中的存储的方法名称来调用方法
  4. 《天天数学》连载37:二月六日
  5. “阿里离职女高管”蹭马云热度遭阿里高管打假:重新定义高管
  6. day20 Python 高阶函数,函数,嵌套,闭包 装饰器
  7. leetcode955. Delete Columns to Make Sorted II
  8. C程序设计--指针(用 “ 函数 ” 对 “ 多维数组 ” 进行操作)
  9. BZOJ1027[JSOI2007] 合金
  10. 【浅墨著作】《逐梦旅程:Windows游戏编程之从零开始》勘误配套源代码下载...
  11. HCIP认证学习day2
  12. 微信更新,干掉手机输入法
  13. 无法打开文件“d3dx9.lib_三个小技巧,教会你解决无法打开手机文件问题
  14. 中文文字检测及识别(ORC)
  15. L1-079 天梯赛的善良 (20 分)python
  16. tar 命令打包压缩tar.gz,不包含当前文件夹路径
  17. 用google搜索图书的方法
  18. 大数据入门培训之大数据开发基础知识学习
  19. 什么是大数据?什么是物联网?
  20. 困扰一周的配环境问题——RTX3090+CUDA11.1

热门文章

  1. 大麦生成链接 大麦生成订单截图 抢票成功截图
  2. 如何添加局域网打印机(网络打印机)?
  3. JTA Transactions
  4. C# OPC客户端访问讯饶OPC服务器访问SunFull.X2OPC.1 报错
  5. Week9作业ABC
  6. 关于告警管理的软件,您还只知道Pagerduty吗?
  7. 喜讯:乔迁至CSDN
  8. 关于EAD: Elastic-Net Attacks to Deep Neural Networks via Adversarial Examples的理解
  9. 什么是程序员的优秀品质?
  10. 《学习科学与技术》——从中学生学习的角度来看学习动机的激发