管道通信

进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe)

こ雲淡風輕ζ 提交于 2019-12-26 03:40:00
进程:   之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。 进程间通信 用Queue模块: IPC (Inter-Process Communication) 队列 概念介绍 队列是先进先出 必须put放进东西后 才能get来取值 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。 Queue([maxsize]) 创建共享的进程队列。 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 底层队列使用管道和锁定实现。 Queue([maxsize]) 创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。 Queue的实例q具有以下方法: q.get( [ block [

进程间通信-管道

拜拜、爱过 提交于 2019-12-24 12:06:13
转自: 0giant 管道允许在进程之间按先进先出的方式传送数据,是进程间通信的一种常见方式。 管道是Linux 支持的最初Unix IPC形式之一,具有以下特点: 1) 管道是 半双工的 ,数据只能向一个方向流动; 需要双方通信时,需要建立起两个管道 ; 2) 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 3) 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 管道分为pipe(无名管道)和fifo(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。 pipe用于相关进程之间的通信,例如父进程和子进程,它通过pipe()系统调用来创建并打开,当最后一个使用它的进程关闭对他的引用时,pipe将自动撤销。 FIFO即命名管道, 在磁盘上有对应的节点,但没有数据块 ——换言之,只是拥有一个名字和相应的访问权限,通过mknode()系统调用或者mkfifo()函数来建立的。一旦建立,任何进程都可以通过文件名将其打开和进行读写,而不局限于父子进程,当然前提是进程对FIFO有适当的访问权。当不再被进程使用时,FIFO在内存中释放,但磁盘节点仍然存在。 管道的实质是一个内核缓冲区

2019年8月9日星期五(系统编程)

泄露秘密 提交于 2019-12-24 12:05:28
2019 年 8 月 9 日星期五 一 . linux 多进程编程 - 通信方式。 1. 为什么进程之间要进行数据通信? 例子: ./test -> 开启一个名字为 test的进程。 ./project -> 开启一个名字为 project的进程。 通过学习通信方式,使得不同进程之间进行数据交换,例如 test进程发送数据给 project进程,从而控制 project进程运行状态。 2. 在 linux 下,通信方式有哪些?各自有什么特点? 以下几种方式属于系统编程的通信方式,只能同一台主机内部进程通信,不能跨主机。 1 )管道通信 管道通信分为有名管道与无名管道通信,管道也是 linux的一种特殊文件,进程可以写入数据到管道中,从而实现通信。 2 )信号 在 linux下,有非常多信号,例如暂停,继续,停止 ...,某一个进程通过发送信号给另外一个进程,从进行通信。 3 )消息队列 消息队列可以读取另外一个进程发送来的数据,而且可以读取特定的数据。 4 )共享内存 多个进程同时访问同一片内存空间。 能够跨主机通信的,只有网络编程才能实现 。 1 )套接字编程 可以实现不同的主机之间的通信。 二 . 进程之间通信 - 无名管道 1. 什么是无名管道?作用机制如何? 无名管道只能作用于亲缘关系的进程,例如父子进程。无名管道其实是数组来的,里面有读端与写端,进程只需要将数据写入

进程、线程

别来无恙 提交于 2019-12-23 15:56:33
1 进程   程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。需要强调的是:同一个程序执行两次,那也是两个进程。    进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序 用来描 述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外 部特征,描述 进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 进程的基本状态: 1、就绪(Ready)状态 当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。 2、执行状态 进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;再多处理机系统中,则有多个进程处于执行状态。 3、阻塞状态 正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。 三种进程之间的转换图: 几种进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 #

Linux进程间通信——匿名管道

自古美人都是妖i 提交于 2019-12-23 10:38:46
进程如果不是独立进程,那么它就需要和别的进程进行通信。在进程协作时可以采用共享一个缓冲区的方式来实现。当然,OS的IPC提供了一种机制,以允许不必通过共享地址空间来通信和同步其动作。这就不得不提Linux的的前身Unix。因为Linux一开始就是从这儿借鉴的。加上Linux从一开始就遵守POSIX标准。 Unix最早是由AT&T的贝尔实验室开发的,值得一提的是,在Unix操作系统发展的过程中,产生了许多副产物(POSIX标准也是副产物之一),其中最著名的应当是C语言。是的,它仅仅是个副产物。那个时候Ken Thompson 与Dennis Ritchie感到用汇编语言做移植太过于头痛,他们想用高级语言来完成第三版。后来他们改造了B语言,就形成了今天大名鼎鼎的C语言。这个自发明到现在这个物联网时代仍占据编程语言榜前10的稳固位置。不得不感叹其生命力的强大以及适应性的强大。当然,Ken Thompson 与Dennis Ritchie也是图灵奖得主。 到了1980年,有两个最主要的Unix的版本线,一个是UC Berkeley的BSD UNIX,另一个是AT&T的Unix。至今为止UC Berkeley仍在维护Unix(这学校真牛逼)。 最初的Unix的IPC包括,管道,FIFO,信号。贝尔实验室对Unix早期的进程通信进行了改进,形成了system V这个操作系统的IPC。它包括

进程间通信(IPC)

给你一囗甜甜゛ 提交于 2019-12-23 00:31:14
以下是阿鲤对Linux下进程间通信的总结,希望对大家有所帮助;若有误请慷慨指出。 因为每一个进程都要有一个独立的虚拟地址空间,在保证了进程的独立性同时,却使得进程间无法通信;所以必须要借助一定的方法进行进程间通信,阿鲤在这里主要介绍以下几种通信方式(以下均为SystemV标准) 1:管道 -- 用于进程间的数据传输 2:共享内存 -- 用于进程间的数据共享 3:消息队列 -- 用于进程间的数据传输 4:信号量 -- 用于时间进程间控制 注:以下的代码实现均为centos7环境; 一:管道 -- 用于进程间的数据传输 1:本质: 通过让多个进程都能访问到同一块内核中的缓冲区,通过半双工通信实现数据传输 (半双工通信:方向可选择的单项通信) 2:分类: 匿名管道 和 命名管道 3:匿名管道: 这块内核中的缓冲区没有标识符 3.1: 因为匿名管道没有标识符,故只能用于具有亲缘关系之间的进程通信; 3.2: 在创建管道时,操作系统会提供两个操作句炳(文件描述符),其中一个用于从管道读取数据,一个用于向管道写入数据;但是我们在使用时往往会关闭一个使用一个 3.3: 我们都知道子进程是通过复制父进程进行创建的所以,子进程也会复制到父进程所创建管道的操作句柄,故父子进程便可以通过父进程所创建的匿名管道进行进程间通信。 3.4: int pipe(int pipefd[2]): 创建一个匿名管道

进程之间的通信

南笙酒味 提交于 2019-12-16 00:07:03
进程通信 今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | grep 8080 学过 Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。 并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。 mkfifo test 这条命令创建了一个名字为 test 的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写数据 这个时候管道的内容没有被读出的话,那么这个命令就会一直停在这里,只有当另外一个进程把 test 里面的内容读出来的时候这条命令才会结束。接下来我们用另外一个进程来读取 cat < test // 读数据 我们可以看到

进程通信和同步(转)

ぃ、小莉子 提交于 2019-12-09 21:24:53
概念 竞争条件 多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时许,称为竞争条件。 忙等待的互斥 几种实现互斥的方案: 屏蔽中断 1在单处理器系统中,最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,包括时钟中断。CPU 只有在发生中断的时候才会进行进程切换,这样在中断被屏蔽后 CPU 将不会被切换到其他进程。 锁变量 严格轮换法 while (TRUE) { while (turn != 0) critical_region(); turn = 1; noncritical_region(); } while (TRUE) { while (turn != 1) critical_region(); turn = 0; noncritical_region(); } 忙等待检查变量。使用忙等待的锁称为自旋锁。 Peterson 解法 #define FALSE 0 #define TRUE 1 #define N 2 /* number of processes */ int turn; /* whose turn is it? */ int interested[N]; /* all values initially 0 (FALSE) */ void enter_region(int process); /* process is 0 or 1 */ {

linux上的进程通信学习笔记

大城市里の小女人 提交于 2019-12-07 00:17:42
参考资料 <<精通Linux C编程>> http://man7.org/linux/man-pages/man2/open.2.html https://www.cnblogs.com/52php/p/5840229.html 在 Android中的Handler的Native层研究 文章中研究一下一把Linux中的匿名管道的通信机制,今天这里Linux中的进程间通信补齐。 在Linux中,实现进程通信的方法包括管道(匿名管道和具名管道),消息队列,信号量,共享内存,套接口等。消息队列,信号量,共享内存统称为系统的(POSIX和System V)IPC,用于本地间的进程通信,套接口(socket)则运用于远程进程通信。 各个通信机制定义如下: 匿名管道(Pipe)和具名管道(named pipe):匿名管道用于具有亲缘关系进程间的通信,具名管道克服了管道没有名字的限制,因此除了具有匿名管道的功能外,还允许在无亲缘关系的进程中进行通信。 消息队列(Message):消息队列为消息的链接表,包括POSIX消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读取队列中的消息。 共享内存:是的多个进程可以访问同一块内存空间,是最快的可以IPC形式。是针对其他的通信机制运行效率较低而设计出来的。往往与其他通信机制,如信号量结合使用

进程间通信 IPC interprocess communication

非 Y 不嫁゛ 提交于 2019-12-06 20:09:55
1,管道,FIFO 2, 信号 3,消息队列 4,共享类存 5.文件映射 6.socket ( 1 )管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。   ( 2 )命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。   ( 3 )信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。   ( 4 )消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺   ( 5 )共享内存:使得多个进程可以访问同一块内存空间