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

Linux进程通信——管道

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

4K70

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; } 进行通信: 读端多出一行空行:端输入之后按了回车

    22140

    Linux进程通信——有名管道

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

    3.2K30

    Linux】————进程间通信(匿名管道)

    IPC 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 管道 匿名管道: 一个进程将同一个文件打开两次,一次以方式打开,另一次以读方式打开。...如果此时有创建了子进程,子进程会继承父进程的文件描述表,指向同一个文件,我们把上面分子进程都看到的文件,叫做管道文件,管道只允许单向通信,管道里的内容不需要刷新的磁盘。...: 如果此时管道是空的,并且段fd还没有关闭,此时读取条件不具备,都进程会被阻塞,读进程会等待,直到段写入数据 如果管道满,并且读端fd不读且没有关闭,此时写进程会被阻塞,知道数据被读取 如果读端一直在读...,并且段关闭了wfd,读端read返回值会读到0,表示读到文件结尾 如果读端rfd直接关闭,段wfd一直写入,那么端会被OS直接用13信号关闭掉,相当于进程出现了异常 进程池的实现: hpp: Processplool.hpp...,所以我们需要在每次创建一个子进程之后关闭掉继承下来的端 最后: 十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我: 1.一个冷知识: 屏蔽力是一个人最顶级的能力,任何消耗你的人和事

    10110

    Linux进程间通信——管道

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

    33031

    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.4K10

    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.6K80

    Linux进程间通信【命名管道

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

    34220

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

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

    1.9K30

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

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

    4K52

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

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

    3K70

    Linux进程间通信之管道

    当我们创建一个进程,在linux系统中它被如下图进行管理: 我们再通过这个进程创建一个子进程,子进程继承父进程的代码和数据:  没错,此时我们的父子进程能看到同一份资源,我们可以模拟一下通信,父进程往缓冲区写入...1.父进程用pipe函数创建管道。 2.父进程通过fork函数创建子进程。 3.假设我们让子进程,父进程读,所以我们要关闭不用的文件描述符,父进程关闭端,子进程关闭读端。  ...2.读端进程不读,进程一直写,那么当管道满后,对应的进程会被挂起,直到管道当中的数据被读端进程读取后,进程才会被唤醒。...3.进程将数据写完后将端关闭,那么读端进程管道当中的数据读完后,就会继续执行该进程之后的代码逻辑,而不会被挂起。...4.读端进程将读端关闭,而进程还在一直向管道写入数据,那么操作系统会将进程杀掉。

    9210

    Linux进程间通信(匿名管道)

    : 如果管道内部是空的,并且端fd没有关闭,此时读取条件不具备,读进程会被阻塞,读进程会等待,直到端写入数据。...管道的特征: 匿名管道:只用来进行具有血缘关系的进程之间,进行通信,常用于父子进程之间通信 管道文件的生命周期是随进程管道内部,自带进程之间同步的机制(执行流执行代码的时候,具有明显的顺序性)...(的次数和读取的次数不是一一匹配的) 管道的通信模式,是一种特殊的半双工模式,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性...创建子进程的时候,从第二个子进程开始,创建的时候会继承父进程之前的文件描述符,也就会连接到进程1的端。...随着子进程的增加,越来越多描述符指向先前的管道端 ,就会导致要关闭管道时,端没关完,读端读不到,就会造成阻塞,进程就退出不了。

    14810

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

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

    1.4K10

    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) { // 遍历回收就好了

    29920

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

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

    12810
    领券