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

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

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

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

一.匿名管道(pipe):

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

创建匿名管道的过程:

  1. 父进程通过pipe函数创建一个管道,得到两个文件描述符指向管道的两端。
  2. 父进程调用fork函数创建一个子进程,子进程会继承父进程PCB中的一部分数据,所以子进程也有两个文件描述符指向管道的两端。
  3. 父进程关闭管道读端,子进程关闭管道写端(close函数关闭读/写端)。注:应该先写入数据再进行读操作(问题:难道不能父进程关闭写端,子进程关闭读端?)

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

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

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

创建命名管道的方式:

  1. 在Shell下交互的建立一个命名管道。(manode或mkfifo)
  2. 在程序中使用系统调用函数建立命名管道。

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

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

四.消息队列(message queue):

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

消息队列结构体:

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

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

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

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

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

时间: 2024-10-09 07:10:19

进程之进程间的8种通信方式的相关文章

进程间的八种通信方式----共享内存是最快的 IPC 方式

1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式. 3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. 4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识

进程间的几种通信方式

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

进程间的8种通信方式

无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式. 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识.消息队列

python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型

一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全. 1.上厕所的小例子:你上厕所的时候肯定得锁门吧,有人来了看见门锁着,就会在外面等着,等你吧门开开出来的时候,下一个人才去上厕所. from multiprocessing import Process,Lock import os import

守护进程接收终端输入的一种变通性方法

说明 本文主要介绍某嵌入式产品中DSL用户态驱动模块作为守护进程时,如何接收终端输入的变通性方法. 出于信息安全考虑,文中涉及系统方面的接口函数未给出实现细节,但不影响表述的完整性. 相关性文章参见<GNU Readline库函数的应用示例>. 一  背景知识 init进程(如Busybox init)是嵌入式系统内核自举时启动的第一个也是惟一的用户进程.init进程是后续所有其他进程的父进程(其进程ID为1),在系统运行期间以守护进程的形式一直存在.它主要负责启动各运行层次特定的系统服务(如

父子进程共享内存通信的三种方法

1.  mmap MAP_ANONYMOUS 在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存即可, 2. mmap  /dev/zero 有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果. 3. shmget shmat shmctl shmget 是老式的system V 共享内存模式,很多系统都支持这种方法. 父子进程共享内存通信的三种方法

浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给大家分别介绍一下这三种特殊的进程! 1.孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的. #include <sys/types.h> #include <unistd.h> #inclu

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改

守护进程接收终端输入的一种变通性方法(二)

前言 本文作为<守护进程接收终端输入的一种变通性方法>的补充版,主要讨论不使用第三方库时,如何支持字符终端命令行的退格和历史记录.文中涉及的代码运行环境如下: 一  退格键 术语“退格”(BS,BackSpace)本意指删除光标左侧的一个字符.最初的打字机中,退格键将机架(carriage)回退一个位置:而在现代计算机系统中,退格键将显示器光标左移一个位置,并删除该处的字符,然后将该处之后的文字左移一个位置. 删除(DEL,Delete)键可追溯到计算机使用打孔磁带的年代.当时,纠正一个字符打