首页
学习
活动
专区
工具
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; } 进行通信: 读端多出一行空行:写端输入之后多按了回车

    23240

    Linux进程通信——有名管道

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

    3.3K30

    【Linux】进程通信之管道

    在Linux中使用管道 首先,学过Linux命令的话,大家对于管道肯定不陌生, Linux管道使用竖线 | 连接多个命令,这个被称为管道符。...,即它们会指向相同的文件: 然后我们分别关闭父进程对管道文件的读方式,以及子进程对管道文件的写方式,这时,管道文件就成为了一个由父进程写入数据,子进程读取数据的通信管道文件:...当然也可以关闭父进程对管道文件的写方式,以及子进程对管道文件的读方式,这样管道文件就成为了一个由子进程写入数据,父进程读取数据的通信管道文件。...编码实现父子进程通信管道 管道的实现思路如下: 创建管道 创建子进程, 子进程关闭读端, 然后开始向管道写入数据 父进程关闭写端,然后开始向管道读数据 读取完毕,父子进程关闭自己所使用的写...将保证写入的原子性 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性 管道特点 管道的特点: 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;

    13610

    【Linux】IPC 进程间通信(一):管道(匿名管道&命名管道)

    当父进程要传输数据给子进程时,就可以只使用以写方式打开的文件的管道文件,关闭以读方式打开的文件, 同样的,子进程只是用以读方式打开的文件的管道文件,关闭掉以写方式打开的文件。...(多执行流执行代码的时候,具有明显的顺序性) 管道文件在通信的时候,是面向字节流的。...管道通信的场景 - 进程池 父进程创建多个子进程,并为每个子进程创建一个管道文件,父进程为写端,子进程为读端。父进程给子进程通过管道传输任务,这就是进程池。...命名管道是一种特殊类型的文件(命名管道 -- > mkfifo) 4.2 创建命名管道 Linux系统中,使用 mkfifo 命令创建有名管道文件,再使用两个进程打开即可 $ mkfifo filename...如下图: Linux 系统编程中使用 mkfifo 函数创建一个管道文件,再让两个不相关的进程打开: int mkfifo(const char *pathname, mode_t mode); 参数

    13810

    【Linux】Linux管道揭秘:匿名管道如何连接进程世界

    1.什么是管道 ? 管道(Pipe)是一种常见的进程间通信(IPC,Inter-Process Communication)机制,在 Unix/Linux 系统中尤其重要。...管道在 Unix/Linux 系统中提供了一种简便的机制,允许数据在不同进程之间传递。它提供了一个缓冲区,数据写入管道的一端(写端),然后可以从另一端(读端)读取。...,我们都知道,在大部分Linux的指令都是一个可执行文件,运行起来就是一个进程。...使用pepe()的基本流程: 创建管道:调用pipe()函数。 使用fork()创建一个子进程。 在父进程关闭写端,使用读端读取数据。 在子进程中关闭读端,使用写端将数据传输给父进程。...2.1.3 管道的4种情况与5种特性 4种情况: 管道内部没有数据时且子进程不关闭自己的写端文件fd,读端(父)就会堵塞等待,直到pipe有数据, 管道内部被写满且父进程(读端)不关闭自己的fd,写端写满后

    10920

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

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

    10810

    Linux :进程间通信之管道

    ,导致现在很多Linux发型版本都不一样,即使一样,内部的标准也不一样!        ...因为进程管理和文件系统是两个模块(你能打开我是因为操作系统,你还敢要求这么多??我们是平级!!)    ...管道的使用和文件一致,迎合了“Linux一切皆文件思想”。...5、管道是有固定大小的(Linux中是64KB)且具有原子性,但是在不同的内核里可能有区别   验证管道大小: 最后写到65536说明管道大小是64kb  ulimit 命令用于限制 shell 进程及其所创进程的资源使用...6、管道是基于文件的,而文件的生命周期是随进程的  2.5 管道中的四种情况 1、读写端正常,管道如果为空,那么读端就会阻塞 (防止读入一些垃圾数据) 2、读写端正常,管道如果被写满,写端就要阻塞  (

    7610

    Linux之进程间通信——管道

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

    34831

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

    进程间通信分类 Linux进程间通信可以分为以下几种分类: 匿名管道(Pipe):管道是一种半双工的通信机制,可以在同一个进程中的两个文件描述符之间传递数据。...匿名管道pipe   在Linux中,匿名管道(anonymous pipe)是一种常用的进程间通信机制。...创建匿名管道的思路如下: 父进程调用系统调用创建管道: 父进程使用读和写两种方式打开管道文件,虽然是一个管道文件,但是文件描述符有两个并且struct file也有两个,一个指向读,一个指向写,但是都指向同一个文件内核缓冲区...只能选择一个,父进程读,子进程就写;子进程读,父进程就写。...,可能会出现以下场景: 管道为空,read会阻塞 管道为满,write会阻塞 管道是有上限,在某些系统下它只能写入64kb的内容,所以当管道写满了,write就会阻塞 管道写端关闭,读端最终会读到

    11500

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

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

    4.1K52

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

    命名管道介绍   匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用命名管道来做这项工作。   ...在Linux系统中,命名管道(也称为FIFO,First In First Out)是一种特殊的文件类型,它允许进程间进行通信。...与匿名管道不同,命名管道存在于文件系统中,并且可以被任何有适当权限的进程访问。命名管道提供了一种方法,使得不相关的进程能够通过预先定义好的路径来交换数据。 2....break;//跳出死循环 std::cout<<message<<std::endl; } 结果如下: 先关闭Server可执行程序: 读端也就是Server端关闭后,写端的进程会收到信号进而终止程序...时 ◦ O_NONBLOCK disable(阻塞模式):阻塞直到有相应进程为写⽽打开该FIFO ◦ O_NONBLOCK enable(非阻塞模式):⽴刻返回成功 • 如果当前打开操作是为写⽽打开

    13710

    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】进程间通信——命名管道

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

    1.9K30

    Linux进程间通信【命名管道】

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

    39920

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

    9310

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

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

    15910
    领券