进程之进程间的8种通信方式

简介:

首先看一下进程间通信的概念(IPC:InterProcess Communication):每个进程各有不同的用户地址空间,如何一个进程的全局变量是不能被别的进程看见的,所以进程间通信都要经过内核,在内核中开辟一个缓存区,这个缓存区是所有与缓存区相关的进程都能访问的。进程1把数据从用户空间拷到内核缓存区,进程2再从缓存区把数据读到自己的用户空间。内核提供的这种机制就叫做进程间通信。


wKiom1cJzRyyl5RBAAA7kjwiSGM608.png

所以这8中通信方式就是在内核开辟缓存区的8种不同方式。

注意:每个IPC都会维护一个结构体(ipc_perm):


wKioL1cJ0vqitKUpAAA4OOhtTXs969.png

一.匿名管道(pipe):

匿名管道是一种半双工(在同一信道上,同一时刻只能接受或者发送数据)的通信方式,数据只能单向流动。匿名管道通过文件描述符进行操作,子进程会继承父进程的文件描述符。所以匿名管道只能用于有血缘关系的进程的进程间通信。

创建匿名管道的过程:

  1. 父进程通过pipe函数创建一个管道,得到两个文件描述符指向管道的两端。

  2. 父进程调用fork函数创建一个子进程,子进程会继承父进程PCB中的一部分数据,所以子进程也有两个文件描述符指向管道的两端。

  3. 父进程关闭管道读端,子进程关闭管道写端(close函数关闭读/写端)。注:应该先写入数据再进行读操作(问题:难道不能父进程关闭写端,子进程关闭读端?)

注:管道是以环形队列实现的,是以流的形式传递数据的。


二.命名管道(named pipe或FIFO):

命名管道也是一种半双工的通信方式,但它是通过路径名与缓存区关联。因为路径名在系统中是全局的,所以不同的进程即使没有血缘关系也能进行通信。

创建命名管道的方式:

  1. 在Shell下交互的建立一个命名管道。(manode或mkfifo)

  2. 在程序中使用系统调用函数建立命名管道。


三.高级管道(popen):(等待更新)

将另一个程序当作一个新的进程在当前程序进程中启动,它相当于当前程序的子进程。


四.消息队列(message queue):

消息队列是消息的链表,存放在内核中并由消息队列标识符标识,提供了一种从一个进程向另一个进程发送数据块(有不同的类型值)的方法,它可以设置为全双工的通信方式。

消息队列结构体:

wKiom1cKDSPxtvn7AABs33uSO4Y754.png

注:重要的是前三个和最后两个。

五.信号量(semophore):信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他通信资源的P/V来实现进程间的通信,它也可以设置为全双工的通信。


六.信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。(待更新)


七.共享内存(shared memory):共享内存就是一个进程映射出一段可以被别的进程所访问的内存,这段内存由一个进程所创建,但能被其它进程访问。共享内存是IPC中最快的一种通信方式,是针对其它进程间通信方式效率低而设计,通常是和其它通信方式配合使用。(待更新)


八.套接字:套接字是一种特殊的通信方式,它可以用在不同机器之间的通信。(待更新)










本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1762349,如需转载请自行联系原作者
目录
相关文章
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
398 16
【进程通信】信号的捕捉原理&&用户态与内核态的区别
【进程通信】信号的捕捉原理&&用户态与内核态的区别
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
1140 4
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
442 1
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
323 0

热门文章

最新文章