首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux进程通信——管道

这里要注意,不能总让一个子进程工作,要分工做。...//回收子进程 waitProcess(arr); return 0; } 在创建子进程那部分有一个雷点,就是创建第一个子进程的时候,父进程的fd有两个是指向管道的,子进程就继承了父进程的文件描述符表...创建第二个子进程的时候,第二个子进程也继承了父进程的文件描述符表,同样是关闭对应的读写端,但是父进程的文件描述符表中还存着对于第一个子进程端,这就是一个隐藏的bug。...也就是说我们进行关闭父进程的第一个端的时候,其实还有其他进程指向第一个子进程,也就是说他的返回值不是0,并且依旧阻塞。...如果是批量化的关闭所有的段文件描述符,前面的子进程没有关闭完成端就先不关闭进程,就要去后面的子进程,到了最后一个进程,只有一个父进程对应的段,那么关闭之后最后一个子进程就没有对应的段了,相对应的文件描述符表也就关闭了

3.9K70

Linux进程通信 管道

(2)管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使用了。(FIFO无此局限)。       ...--《Unix环境高级编程》 通俗理解: Linux管道通信,通讯方式正如其名一样,如同一个大管道,一端流入,一端流出。...PIPE PIPE是一种半双工管道,其中,fd[1]用来向管道写入数据,fd[0]用来从管道读出数据。若两个进程需要利用PIPE通信,就要保证一个进程使用fd[0],另一个进程使用fd[1]。...即在父进程管道写入终端输入的 “HelloWorld”,然后在子进程读取管道数据,并在终端输出。...类似的,只open要阻塞到某个进程为读而打开这个FIFO为止。 (2)若指定O_NONBLOCK,则只读open立即返回。

3.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

Linux进程间通信——管道

两个进程如何看到同一个管道文件:fork创建子进程完成 管道创建时分别以读和方式打开同一个文件(如果只读或者只,子进程也只会继承只读或只,父子双方打开文件的方式一样,无法完成单向通信);父进程创建子进程...: 1.读快写慢 子进程休眠时,不在写入,父进程在读取(如果管道中没有数据,读端在读,此时默认会直接阻塞当前正在读取的进程) 2.读慢快 拿着管道读端不读,端一直在端往管道,而管道是有大小的...,不断往,会被管道是固定大小的缓冲区,当管道满,就不能再写了。...3.写入关闭,读到0 子进程写入端关闭: 4.读取关闭,写入 管道是单向的:读端关闭,在写入就没有意义了:OS会终止端,会给写进程发送信号,终止管道特征 1.管道的生命周期随进程进程退出...break; } } close(rfd); removeFifo(NAMED_PIPE); return 0; } 进行通信: 读端多出一行空行:端输入之后按了回车

16440

Linux进程通信——有名管道

管道(pipe)是无名管道,他是进程资源的一部分,随着进程的结束而消失。并且它只能在拥有公共祖先进程进程内通信。而有名管道(FIFO)的出现则解决了这个问题。FIFO提供了一个路径名与它关联。...这样可以通过访问该路径就能使得两个进程之间相互通信。此处的FIFO严格遵守“先进先出”原则。读总是从头开始的,总是从尾部进行的。匿名管道和FIFO都不支持lseek函数对他们操作。...Linux下建立有名管道的函数是mkfifo。...管道这个名字是非常形象的,一个管道必须有两端(就是在一个进程中必须读,另一个进程必须),只有这样,才能正常操作,否则进程将会阻塞。例如下面这样。...调用 write() 函数向 FIFO 里数据,当缓冲区已满时 write() 也会阻塞。 通信过程中,读进程退出后,写进程向命名管道数据时,写进程也会退出。

2.7K30

Linux进程间通信——管道

前言 管道Linux中最古老的进程间通信的方式,本文介绍了进程间通信的相关概念,主要介绍了匿名管道和命名管道。 一、进程间通信 1.概念 什么是进程间通信?...fork创建子进程管道创建时,要分别以读和的方式打开同一个文件(如果父进程是以只读或只的方式(其中一种方式)打开文件,子进程也只会继承只读或者只,父子双方打开文件的方式一样,导致无法完成单向通信...读取管道进程一直不进行读取,而端一直在写入。...端可以向管道内写入,但是管道是固定大小的缓冲区,不断的只不读管道会被满。满了以后就不能再写入了,此时端会处于阻塞状态。...sleep(2)的话,读取的速度稍微比较慢: 这种情况,端是将数据塞到管道内,管道读取是安装指定大小读取(并非一行一行的读取,最初安装一行来读取是因为写入的慢,一次只一行数据,数据就被读取了

22031

图解 | Linux进程通信 - 管道实现

然后父进程使用 fork 系统调用创建一个子进程。 由于子进程会继承父进程打开的文件句柄,所以父子进程可以通过新创建的管道进行通信。...前面介绍了 管道(pipe) 的使用,接下来将会介绍管道在内核中的实现方式。 本文使用 Linux-2.6.23 内核作为分析对象。 1....当向管道数据时,从指针指向的位置开始写入,并且将指针向前移动。而从管道读取数据时,从读指针开始读入,并且将读指针向前移动。当对没有数据可读的管道进行读操作,将会阻塞当前进程。...而对没有空闲空间的管道进行操作,也会阻塞当前进程。 注意:可以将管道文件描述符设置为非阻塞,这样对管道进行读写操作时,就不会阻塞当前进程。 2....管道对象 在 Linux 内核中,管道使用 pipe_inode_info 对象来进行管理。

3.7K52

Linux进程间通信之管道

2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只一点用法吧。...(2)非命令行:这里又分有名管道和无名管道 编程模型:进程A创建管道(mkfifo) -> 进程A打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道数据(write)...注意:   数据的进程关闭读端pipefd[0]       读数据的进程关闭端pipefd[1] 实例: #include #include #include...2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只一点用法吧。...编程模型:进程A创建管道(mkfifo) -> 进程A打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道数据(write) ->        进程B从管道中读数据

2.5K80

Linux进程通信之管道解析

,下面是在 Linux 端运行命令行的一个截图: ?...那要如何使用管道在两个进程之间通信呢,我们可以使用 fork()创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个fd[0]与fd[1],两个进程就可以通过各自的fd写入和读取同一个管道文件实现进程通信了...{ printf("now,write data to pipe\n"); if (write(pipedes[1], s, 14) == -1) // 数据到管道...image-20210704172243185 命名管道 命名管道又被称之为是 FIFO ,未命名的管道只能在两个相关的进程之间使用,而且这两个相关的进程还要又一个共同创建了他们的祖先进程,但是,通过...下面是一个使用命名管道进行进程间通信的例子,例子分为两个程序,分别是读部分和部分,首先看先往管道数据的代码,代码如下所示: #include #include <string.h

1.3K10

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

@TOC 命名管道 匿名管道只能用来进行进程间通信,让具有血缘关系的进程进行通信 让毫不相关的进程之间进行通信,就需要采用命名管道通信 因为该文件有文件名称的,而且必须要有,所以叫做命名管道 1....命名管道原理 要打开对应的文件,就会在操作系统内创建struct file对象,struct file对象有自己的缓冲区 由于0 1 2 分别被占用,所以3指向struct file对象 若有一个毫不相关的进程...当新创建一个进程时,引用计数就会变成2 此时两个进程指向同一份文件 目的是让两个进程之间进行通信,所以就不应该把数据刷到磁盘上, 应该把磁盘文件改为内存级的,不会进行刷盘,把它命名为管道文件 如何保证两个毫不相关的进程...==0,说明读到文件结尾,当端关闭时,读端才会读到文件结尾 若返回<0,说明读取失败,则返回错误码 3....,所以在客户端不用创建管道文件 直接打开文件即可,以方式打开文件 ---- 为了避免输入的单词有空格存在 输入 man fgets 指令 从指定的流中获取字符串,并规定字符串的大小 ----

1.8K30

Linux进程间通信【命名管道

Linux进程间通信【匿名管道】》 2.1、特点 可以简单总结为: 管道是半双工通信 管道生命随进程而终止 命名管道任意多个进程间通信 管道提供的是流式数据传输服务 管道自带 同步与互斥 机制 2.2...、四种特殊场景 四种场景分别为 管道为空时,读端阻塞,等待端写入数据 管道为满时,端阻塞,等待读端读取数据 进程通信时,关闭读端,OS 发出 13 号信号 SIGPIPE 终止进程 进程通信时,...注意: 创建管道文件后,无论先启动读端,还是先启动端,都要阻塞式的等待另一方进行交互 3.2、实现进程控制 在 Linux 匿名管道 IPC 中,我们实现了一个简易版的进程控制程序,原理是通过多条匿名管道实现父进程对多个子进程执行任务分配...的具体实现可以看看这篇文章 《Linux模拟实现【简易版bash】》 步骤: 创建命名管道 将 bash 改装,打开命名管道文件,作为 读端 创建独立进程,打开命名管道文件,作为 端 进行 IPC,发送命令给...》 ---- 总结 以上就是本次关于 Linux 进程间通信之命名管道的全部内容了,作为匿名管道的兄弟,命名管道具备匿名管道的大部分特性,使用方法也基本一致,不过二者在创建和打开方式上各有不同:匿名管道简单

18720

Linux进程间通信(一) - 管道

管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道。...写进程管道的尾端写入数据,读进程管道的头端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。管道主要用于不同进程间通信。...当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。 ?..., size_t count); //管道 ssize_t write(int fd, const void* buf, size_t count); 代码说明:子进程,父进程读 #include<...由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。

3K70

Linux进程间通信【匿名管道

fd,确保 单流向 的原则 注:命名管道可以支持不具有血缘关系进程间通信 关于匿名管道还有一个函数:pipe2 (了解),比 pipe 函数一个参数2 flags,可以使匿名管道在发生特殊情况时,...i386 平台中,管道大小为 4096 字节,即 4kb),从 Linux 2.6.11 开始,管道大小的容量统一为 65536 字节,即 64kb 因为在 Linux 2.6.11 版本中,对管道进行更新...,极大提高了效率 三、通过程序验证 这个前面就已经验证过了,不断往管道数据,直到管道满 每次写入 1 字节的数据,可以看到最终写了 65536 字节的数据 总之,从 Linux 2.6.11...父进程选择某个子进程,并通过匿名管道与子进程通信,并下达指定的任务让其执行 8.1、逻辑设计 首先创建一批子进程及匿名管道 -> 子进程(读端)阻塞,等待端写入数据 -> 选择相应的进程,并对其写入任务编号...子进程回收十分简单,因为已经在 PP 中存储了各个子进程的 PID,只需要遍历等待回收即可 void WaitProcess(vector &PP) { // 遍历回收就好了

18620

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

这样将进程之间的通信不仅仅限制在单机内。Linux继承了这些。...资源共享 进程控制:一个进程控制另外一个进程的执行(例如debug程序)。它希望知道另一个进程的实时状态。 Linux进程通信方式: 管道管道(pipe)分为无名管道和有名管道。...代码中为了避免向读取端写入和从写入端读取而引发的错误,在读的时候关闭端,在的时候关闭读端。 代码中先让父进程管道文件中写入了字符串“Hello World!”。...之后wait()将父进程挂起,子进程完成读取。同样,管道已经满时,进程再试图管道,在其它进程管道中移走数据之前,写进程将一直阻塞。...这个时候,在父进程中将无法写入。所以管道这个描述还是很形象的,当你向一段水管里面装水的时候,需要将另一端堵上,否则装入的水全都流走了。因此在父进程的时候,需要先关闭读;在子进程读的时候需要先关闭

1.4K10

Linux进程通信之匿名管道通信

二、管道通信 2.1、匿名管道通信的原理 基于文件的方式,让不同进程看到同一份资源的通信方式,叫做管道管道通信只能为单向通信。...如果今天我们让父进程以读和两种方式打开同一个文件,操作系统是会为我们创建两个struct file结构体的,只不过这两个struct file结构体的缓冲区是同一个。...如果我们让这个父进程创建一个子进程,子进程的PCB和文件描述符表和父进程一模一样,所以此时子进程也是以读和两种方式打开了父进程打开的这个文件。这样操作就让父子进程看到了同一份资源。...也就是说,struct file对象是允许多个进程通过指针指向它的。 前面也说过,管道通信为单向通信,所以如果想让父进程进程读,就关闭父进程的读端关闭子进程端,反之亦然。...匿名管道只能让具有血缘关系的进程进行进程通信,常用于父子进程之间进行进程通信。

12010

Linux】匿名管道实现简单进程

一、匿名管道通信的四种情况和五种特性 1.1、四种情况 管道内部没有数据且子进程不关闭自己的端文件fd,读端(父进程)就要阻塞等待,直到管道里有数据。...管道内部被满了且父进程(读端)不关闭自己的读端fd,端(子进程满以后就要阻塞等待。...对于端而言,如果端不写了且关闭了端fd,读端就会将管道中的数据读完,最后会读到返回值为0,表示读结束,类似于读到了文件的结尾。...具有血缘关系的进程进行通信,常见于父子。 管道是面向字节流的。 父子进程退出,管道自动释放,因为内存中的文件的生命周期是随进程的。  管道只能进行单向通信。...,因为父进程在创建子进程的同时会将父进程的文件描述符表也给子进程拷贝一份, //这样子进程的文件描述符表就会保存了之前的子进程端文件描述符,必须要把之前的子进程端文件描述符关闭

9110

linux 进程通信-管道(pipe)《Rice linux 学习开发》

Pipe概述 管道Linux进程间通信的一种方式,它分为三种:无名管道,标准流管道,有名管道。...1-无名管道:只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程) 它是一个半双工的通信模式,具有固定的读端和端。...实际上,通常先是创建一个管道,再通过fork()函数创建一子进程,该子进程会继承父进程的所创建的管道 父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或端的文件描述符关闭即可...它可以使互不相关的两个进程彼此通信, FIFO是严格的遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对他们的则把数据添加到末尾,他们不支持如lseek()等文件定位操作 有名管道的穿件可以使用函数...,则不论FIFO内是否有数据,读进程都会立即执行读操作,即如果FIFO内没有数据,则读函数将立即返回0 对于写进程 ‍‍‍‍ 若管道是阻塞打开,则操作将一直阻塞到数据可以被写入 若管道是非阻塞打开而不能写入全部数据

1.6K20

Linux】基于管道进行进程间通信

答案是可以做到的,而且在操作系统内核中,会存在非常的内存级文件,而这些文件不在磁盘中真正存在,只要它们能在内存里被我们用起来即可。...我们也可以读一下管道的手册: 如上,也就是说从 Linux 2.6.11 内核之后管道的大小就变成了 64KB;我们接着看: 我们可以看到有一个 PIPE_BUF 的东西,其实它就是单次向管道中写入的大小...那么如下图,当父进程接收任务之前,它先一次性同时创建出若干个子进程。...然后为了更好地控制这些子进程,父进程和每一个子进程都建立一条管道的信道,然后让每一个子进程只从管道中进行读取,而父进程每次想往哪个管道内容,就往哪个管道内容。...所以,我们让父进程管道里写入4字节 数据,数据不同值代表不同任务,我们就可以想让哪个子进程执行什么任务,就让哪个子进程执行什么任务。

13010
领券