管道通信

python多进程通信实例分析

会有一股神秘感。 提交于 2019-11-29 02:31:28
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在。那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么?本文就来借助Python简单的聊一下进程之间的通信?还是那句话,原理是相同的,希望能透过具体的例子来体会一下本质的东西。 下面尽量以简单的方式介绍一下每一类通信方式,具体的细节可以参照文档使用; 1. 管道 先来看一下最简单、古老的一种IPC:管道。通常指的是无名管道,本质上可以看做一种文件,只存在于内存当中,不会存盘。不同进程通过系统提供的接口来向管道中读取或者写入数据。 也就是说我们通过这样一个中间介质为进程提供交流的方式。无名管道的局限在于一般只用于有直接关联关系的父子进程。下面通过一个简单的例子来看一下其用法。 from multiprocessing import Process, Pipe def pstart(pname, conn): conn.send("Data@subprocess") print(conn.recv()) # Data@parentprocess if __name__ == '__main__': conn1, conn2 = Pipe(True) sub_proc = Process(target=pstart, args=(

c++进程间通信

泄露秘密 提交于 2019-11-29 00:51:08
进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它)们发生了某种事件(如进程终止时通知父进程)。 进程控制:有些进程需要完全控制另一个进程的执行(Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并且能够及时知道它的状态改变。 进程间通信发展 管道 System V进程间通信 POSIX进程间通信 进程间通信分类 管道 匿名管道pipe 命名管道 System V IPC System V 消息队列 System V 共享内存 System V 信号量 POSIX IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 4.管道 管道是Unix中最古老的进程间通信的形式 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 匿名管道 #include<unistd.h> 功能:创建一无名管道 原型 int pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端,fd[1]表示写端 返回值:成功返回0,失败返回错误代码 来源: https://blog.csdn.net/NietzscheI/article/details/100166206

进程间通信

Deadly 提交于 2019-11-28 21:54:45
进程间通信 文章目录 进程间通信 1 概述 2 管道 2.1 概述 2.2 管道系统调用 2.3 标准流管道 3 FIFO 3.1 概述 3.2 mkfifo函数 4 信号 4.1 概述 4.2 信号发送与捕捉 4.3 信号的处理 4.4 信号集函数组 5 信号量 5.1 概述 5.2 信号量的应用 6 共享内存 6.1 概述 6.2 共享内存的应用 7 消息队列 7.1 概述 7.2 应用 进程捕捉到信号并对其进行处理时,正在执行的指令序列被信号处理程序临时中断,先执行信号处理程序中的指令,若从信号处理程序返回,则继续执行捕捉到信号时正在执行的指令序列。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处,故信号处理程序中应保证调用安全的函数(是可重入的并是异步信号安全的)。若在信号处理程序中调用不可重入函数,其结果是不可预测的。 不可重入信号: (1)使用静态数据结构。 (2)调用malloc或free。 (3)是标准I/O函数。 1 概述 进程间通信(InterProcess Communication, IPC)方式主要有以下几种: 管道 (Pipe)及 有名管道 (named pipe):管道可用于具有亲缘关系进程间的通信,有名管道具有管道所具有的功能且允许无亲缘关系进程间的通信。 信号 (Signal):信号是在软件层次上对中断机制的一种模拟,用于通知进程有某事件发生

进程间的通信方式(java)

浪尽此生 提交于 2019-11-28 15:54:39
由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两个进程之间的通信。以下是常用的进程间通信方式。 管道(Pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。( 半双工:数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。 ) 有名管道(named pipe): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令 mkfifo 或系统调用 mkfifo 来创建。 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生。 消息(Message)队列:消息队列是 消息的链接表 。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载 信息量少 , 管道 只能承载 无格式字节流 以及缓冲区大小受限等缺点。 共享内存:使得多个进程可以访问同一块内存空间,是 最快的 可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如 信号量 结合使用,来达到进程间的同步及互斥。 内存映射(mapped memory):内存映射允许任何多个进程间通信

操作系统--进程间通信(一)

江枫思渺然 提交于 2019-11-28 14:47:16
原文引用 https://www.dazhuanlan.com/2019/08/26/5d632d2a07f58/ IPC 运用范畴 配图与本文无关,纯属有趣 相对于做点什么,我们更想睡懒觉,但是相对于睡觉,我想写总结! 今天把博客的 git 分支搞混了,浪费了一点时间。那么今天介绍一下进程间通信( IPC ) 。进程间通信,我们从 << UNIX 网络编程卷2:进程间通信 >> 最后一章 Sun RPC 谈起,那为什么呢? 因为我们去掌握一个东西,肯定是因为它有价值,我们才去学习,如果一些技术现在都不用了,淘汰了,那我们就没有必要去深究,只需学习其思想,浅尝辄止即可。 最后一张概述部分是这样介绍的,构筑一个应用进程时,我们首先在以下两者之间作出选择: (1) 构筑一个庞大的单一进程,完成全部工作; (2) 把整个应用进程散步到彼此通信的多个进程中。 如果我们选择后者,接下去的抉择是: 这本著作主要关注的是 2a 这种情况,也就是 使用 消息传递 、 共享内存 、并可能使用某种形式的 同步 来进行同一台主机上的进程间 IPC 。同一进程内不同线程间的 IPC 以及不同进程内各个线程间的 IPC 只是这种情形的特殊情况。 而对于不同部分之间需要网络通信的应用进程则大多数使用 显示网络编程 ( explicit network programming )方式编写,也就是我们现在流行的

Linux之进程间通信IPC

时光怂恿深爱的人放手 提交于 2019-11-28 08:13:19
  进程间通信(IPC)就是指不同进程之间传播和交换数据,每个进程各自有不同的用户地址空间(虚拟地址空间),任何一个进程的全局变量在另一个进程中都看不到,所以进程间要交换数据必须能通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷贝到内核缓冲区,进程B再把数据从内核缓冲区拷贝到自己的用户空间,内核提供的这种机制称为进程间通信;Linux下IPC机制主要分为:管道、信号量、共享内存、消息队列、套接字; 一、管道 1 思想:调用pipe函数会在内核开辟出一块缓冲区称之为管道文件,包含一个读端和一个写端,进程间可以通过该缓冲区进行通信; 2 特点:半双工形式、父子进程、自带同步机制; 3 用法:父进程调用pipe创建管道,得到两个文件描述符fd[2],fd[0]可读,fd[1]可写;父进程fork出子进程,子进程也同样得到两个描述符fd[2];父进程关闭读端fd[0],子进程关闭写端fd[1],这样父进程往管道里写数据,子进程从管道里读数据,管道是用环形队列实现的,数据从写端流入,从读端流出;说明如下: (1)读管道时,若管道为空则阻塞,直到写端write将数据写入到管道;若写端被关闭则返回0; (2)写管道时,若管道已满则阻塞,直到读端read将管道内数据取走;若读端被关闭则返回错误-1,产生信号SIGPIPE; 4 代码实现如下: 1 #include <stdio.h> 2

[并发编程] 进程间通信

随声附和 提交于 2019-11-28 04:04:31
1.进程间通信方式 套接字、信号、匿名管道、命名管道、等等 2.管道 管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。 其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。 由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。 3.匿名管道 概览 由父进程创建的子进程将会赋值父进程包括文件在内的一些资源。如果父进程创建子进程之前创建了一个文件,那么这个文件的描述符就会被父进程在随后所创建的子进程所共享。 也就是说,父、子进程可以通过这个文件进行通信。 如果通信的双方一方只能进行读操作,而另一方只能进行写操作,那么这个文件就是一个只能单方向传送消息的管道。如下图所示: 基本操作 ''' 1.子进程通过os.write -> 管道 -> 父进程 2.父进程os.read()会等待子进程在管道上发送数据(阻塞) ''' import os,sys,time def child(pw): time.sleep(5) msg='child processing' os.write(pw,msg.encode()) #将msg写入文件描述符pw def parent(): r,w = os.pipe() if os.fork() == 0: #child processing child(w)

进程间通信

徘徊边缘 提交于 2019-11-27 14:05:17
进程间通信   基本介绍:     操作系统提供给用户的几种进程间的通信方式     进程间通信方式是干什么的:       进程间数据传输  数据共享  进程控制  事件通知       正式因为有不同的需求,因此操作系统之间有人提供了多找不同的进程间的通信方式:         续继承与unix而来的管道(匿名管道/命名管道)  共享内存  消息队列  信号量     为什么操作系统要给用户提供进程间通信方式:     进程的独立性导致进程之间没有办法进行通信——由操作系统来提供一个公共的媒介,来进行通信   通信方式:     管道:(本质是内存的缓冲区)       管道创建在内核态,是一个“半双工通信”(提供双向选择但是只能单向传输)。在传输信息时提供io操作——返回文件描述符作为       句柄(两个文件描述符)一个用于写入数据,另一个用于读数据     匿名管道/命名管道:       命名管道:有名字则可以通过名字来打开相同的管道进行通信       匿名管道没有名字,因此只能通过子进程复制父进程的方式实现通信(复制了文件描述符)       *匿名管道只能同于具有亲缘关系的进程通信       *命名管道可以用于任意进程间通信              匿名管道:         创建匿名管道(在创建子进程之前):           int pipe(int

Linux网络编程——管道通信

戏子无情 提交于 2019-11-27 13:40:49
管道通信分为无名管道和有名管道,无名管道可以用于具有亲缘关系进程间的通信,有名管道克服管道没有名字的限制 管道是Linux支持的最初UNIX IPC形式之一,具有以下特点 管道是半双工的,数据只能想一个方向流动,需要进行双向通讯时需要建立两个管道 只能用与父子进程和兄弟进程之间(具有亲缘关系)的通讯 单独构成一种独立的文件系统,管道对于管道两端的进程来说就是两个文件,但是它不是普通文件,也不是系统文件,而是一种独立文件 数据的读出和写入,一个进程箱管道中写的内容从管道的另一端读出,写入的内容每次都添加在管道缓冲区的末尾,并且每次都从管道的缓冲区头部读出 建立无名管道 pipe函数用于建立管道 表头文件 #include 函数定义 int pipe(int filedes[ ] 函数说明 pipe()会建立管道,并将文件描述符由参数filedes数组返回,filedes[0]为管道的读取端,filedes[1]为管道的写入端 -返回值- 成功返回0,错误返回-1,并将错误原因存于error中 例如 #include<stdio.h> #include<unistd.h> int main() { int filedes[2]; char buf[80]; pipe(filedes); if (fork() > 0) { char s[] = "hello!\n"; write

进程、线程以及IPC---linux

牧云@^-^@ 提交于 2019-11-27 07:08:05
进程(标识pid) <unistd.h> <sys/types.h> 资源集合:内存 文件 时间片 协处理器 完全复制:复制前执行什么,复制后执行什么 fork() 系统调用函数fork()是创建一个新进程的唯一方式 一次复制一个进程 返回值-1,创建失败; 返回值 0,进入子进程; 一般来说,fork()成功之后,父进程与子进程的执行顺序是不确定的。这取决于内核所使用的调度算法,如果要求父子进程相互同步,则要求某种形式的进程间通信。 vfork() 执行次序: fork():对父子进程的调度室由调度器决定的; vfork():是先调用子进程,等子进程的exit(1)被调用后,再调用父进程; 对数据段的影响: fork():父子进程不共享一段地址空间,修改子进程,父进程的内容并不会受影响。 vfork():在子进程调用exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。即共享代码区和数据区,且地址和内容都是一样的。 IPC机制(6种) 管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal): 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身