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

linux 双向管道控制进程

Linux双向管道控制进程基础概念

在Linux系统中,管道(pipe)是一种进程间通信(IPC)机制,允许一个进程的输出成为另一个进程的输入。双向管道(也称为命名管道或FIFO)则允许两个进程之间进行双向数据交换。

基础概念

  1. 单向管道:通常用于父子进程之间的通信,数据只能单向流动。
  2. 双向管道(FIFO):允许两个不相关的进程通过一个中间文件进行双向通信。

相关优势

  • 简单易用:管道提供了一种简单的通信方式,不需要复杂的协议。
  • 高效:数据在内存中传输,速度较快。
  • 灵活:可以用于不同进程间的通信,包括父子进程和不相关的进程。

类型

  • 匿名管道:通常用于父子进程之间的通信。
  • 命名管道(FIFO):可以在不相关的进程之间进行通信,需要一个文件系统路径来标识。

应用场景

  • 日志记录:一个进程可以将日志信息写入管道,另一个进程读取并处理这些日志。
  • 任务分发:主进程将任务发送到管道,多个工作进程从管道读取任务并执行。
  • 数据同步:两个进程可以通过管道交换数据以实现同步。

示例代码

以下是一个简单的双向管道示例,展示了如何在Linux中使用命名管道(FIFO)进行双向通信。

创建命名管道

代码语言:txt
复制
mkfifo /tmp/myfifo

写入进程(writer.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    int fd = open("/tmp/myfifo", O_WRONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    char message[] = "Hello from writer!";
    write(fd, message, strlen(message) + 1);

    close(fd);
    return 0;
}

读取进程(reader.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    int fd = open("/tmp/myfifo", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    char buffer[100];
    read(fd, buffer, sizeof(buffer));
    printf("Received: %s\n", buffer);

    close(fd);
    return 0;
}

双向通信实现

为了实现双向通信,可以使用两个命名管道,一个用于进程A到进程B的通信,另一个用于进程B到进程A的通信。

进程A(bidirectional_a.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    int fd_to_b = open("/tmp/myfifo_to_b", O_WRONLY);
    int fd_from_b = open("/tmp/myfifo_from_b", O_RDONLY);

    if (fd_to_b == -1 || fd_from_b == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    char message_to_b[] = "Hello from A to B!";
    write(fd_to_b, message_to_b, strlen(message_to_b) + 1);

    char buffer_from_b[100];
    read(fd_from_b, buffer_from_b, sizeof(buffer_from_b));
    printf("A received: %s\n", buffer_from_b);

    close(fd_to_b);
    close(fd_from_b);
    return 0;
}

进程B(bidirectional_b.c)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    int fd_to_a = open("/tmp/myfifo_to_a", O_WRONLY);
    int fd_from_a = open("/tmp/myfifo_from_a", O_RDONLY);

    if (fd_to_a == -1 || fd_from_a == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    char message_from_a[100];
    read(fd_from_a, message_from_a, sizeof(message_from_a));
    printf("B received: %s\n", message_from_a);

    char message_to_a[] = "Hello from B to A!";
    write(fd_to_a, message_to_a, strlen(message_to_a) + 1);

    close(fd_to_a);
    close(fd_from_a);
    return 0;
}

遇到问题及解决方法

问题1:管道无法创建

原因:权限不足或路径已存在且不是FIFO。

解决方法

  • 确保有足够的权限。
  • 使用mkfifo命令创建FIFO,如果路径已存在,先删除再创建。
代码语言:txt
复制
rm /tmp/myfifo
mkfifo /tmp/myfifo

问题2:进程无法读取或写入管道

原因:管道未正确打开或进程间同步问题。

解决方法

  • 确保管道路径正确且已创建。
  • 使用selectpoll等多路复用技术处理多个管道的读写操作。
代码语言:txt
复制
#include <sys/select.h>

fd_set readfds;
FD_ZERO(&readfds);
FD_SET(fd_from_b, &readfds);

select(fd_from_b + 1, &readfds, NULL, NULL, NULL);
if (FD_ISSET(fd_from_b, &readfds)) {
    read(fd_from_b, buffer_from_b, sizeof(buffer_from_b));
}

通过以上方法,可以有效解决Linux双向管道控制进程中的常见问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux进程通信——管道

管道 进程通信概念 管道 匿名管道 创建匿名管道的过程 管道读写的特性 管道本身的特征 基于管道的进程池设计 命名管道 让两个无血缘关系的进程通信 进程通信概念 什么是进程通信 首先我们清楚,进程是具有独立性的...进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。...那么我们如何让两个进程看到同一个管道文件呢? 首先清除fork是创建子进程的,子进程会继承父进程的文件地址,这样就能看到同一份管道文件了,但是这个文件并没有名字,所以叫做匿名管道。...管道本身的特征 1.管道的生命周期是进程的生命周期 2.管道可以用来进行具有血缘关系的进程之间进行通信,常用于父子通信。...基于管道的进程池设计 思路: 这是用一个进程去控制多个进程,这个进程收到某个指令,然后发给这些进程的其中之一,假如说要发1就是帮忙打印东西,2就是帮忙计算等等功能(具体功能不重要,这里不实现)

4K70

Linux进程通信 管道

(2)管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使用了。(FIFO无此局限)。       ...--《Unix环境高级编程》 通俗理解: Linux的管道通信,通讯方式正如其名一样,如同一个大管道,一端流入,一端流出。...PIPE PIPE是一种半双工管道,其中,fd[1]用来向管道写入数据,fd[0]用来从管道读出数据。若两个进程需要利用PIPE通信,就要保证一个进程使用fd[0],另一个进程使用fd[1]。...即在父进程向管道写入终端输入的 “HelloWorld”,然后在子进程读取管道数据,并在终端输出。...FIFO FIFO有时也会被称为命名管道,未命名的管道(PIPE)只能在两个相关的进程间使用,而且这个两个进程还要有共同的创建了它们的祖先进程。但是,通过FIFO,不相关的进程也能进行数据交换。

3.1K10
  • 【Linux】进程间通信——管道

    资源共享:多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程) 进程控制:有些进程希望完全控制另一个进程的执行(...,父进程以读写打开,子进程也是以读写打开(一般而言,管道只用来进行单向数据通信);关闭父子进程不需要的文件描述符,完成通信: 管道分为匿名管道和命名管道 2.2匿名管道 我们通过文件名区分文件,但是如果当前进程的文件没有名字...让两个进程看到同一个文件,通过父进程创建子进程,子进程继承文件地址的方式,看到同一个内存级文件,此时内存级文件没有名称就是匿名管道了。匿名管道能用来父进程和子进程之间进行进程间通信。...: 1.读快写慢 子进程休眠时,不在写入,父进程在读取(如果管道中没有数据,读端在读,此时默认会直接阻塞当前正在读取的进程) 2.读慢写快 拿着管道读端不读,写端一直在写:写端往管道里写,而管道是有大小的...我们从进程间通信开始介绍,而后进入了进程间通信——管道这部分,管道又分为匿名管道和命名管道,以及之间的区别,匿名管道需要具有血缘关系的进程,而命名管道则不需要,同时,匿名管道通过子进程继承文件地址的方式

    23240

    Linux进程通信——有名管道

    管道(pipe)是无名管道,他是进程资源的一部分,随着进程的结束而消失。并且它只能在拥有公共祖先进程的进程内通信。而有名管道(FIFO)的出现则解决了这个问题。FIFO提供了一个路径名与它关联。...Linux下建立有名管道的函数是mkfifo。...管道这个名字是非常形象的,一个管道必须有两端(就是在一个进程中必须读,另一个进程必须写),只有这样,才能正常操作,否则进程将会阻塞。例如下面这样。...或者说,这也体现了进程的并发行,管子有了一端以后,还必须有另一端,这才能构成管道。 测试一下,FIFO用于两个无关进程直接的通信。首先建立我们有两个进程,一个是test1,另一个是test2....通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会退出。

    3.3K30

    【Linux】进程通信之管道

    在Linux中使用管道 首先,学过Linux命令的话,大家对于管道肯定不陌生, Linux管道使用竖线 | 连接多个命令,这个被称为管道符。...另外,通过管道符 | 创建的管道是匿名管道,用完了就会被自动销毁。需要注意的是,匿名管道只能在具有亲缘关系(父子进程,兄弟进程,爷孙进程)的进程间使用。也就是说,匿名管道只能用于亲缘进程之间的通信。...管道的原理 要构建一个父子进程共享的单项管道文件,我们就先在父进程中以读和写两种方式打开同一个管道文件: 然后我们再创建子进程, 这时子进程就会拷贝父进程的文件控制结构体以及里面的文件指针数据...编码实现父子进程通信管道 管道的实现思路如下: 创建管道 创建子进程, 子进程关闭读端, 然后开始向管道写入数据 父进程关闭写端,然后开始向管道读数据 读取完毕,父子进程关闭自己所使用的写...将保证写入的原子性 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性 管道特点 管道的特点: 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;

    13610

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

    (如进程终止 时要通知父进程) 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变 1.2 为什么要有进程间通信...父进程向以写方式打开的文件的管道文件写入,子进程再从以读方式打开的文件的管道文件读取,从而实现管道通信。如果是要子进程向父进程传输数据,同理即可。...管道通信的场景 - 进程池 父进程创建多个子进程,并为每个子进程创建一个管道文件,父进程为写端,子进程为读端。父进程给子进程通过管道传输任务,这就是进程池。...命名管道是一种特殊类型的文件(命名管道 -- > 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的指令学习中,我们就已经接触到了管道。就是这个符号|。...,我们都知道,在大部分Linux的指令都是一个可执行文件,运行起来就是一个进程。...2.1.7 站在内核角度-管道的本质 Linux下一切皆文件. 所以我们也应该用看待文件的眼观,去理解管道。 我们可以将管道(Pipe)理解为一种特殊类型的文件。

    11020

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

    ) 进程控制:有些进程完全控制另一些进程的执行,此时控制进程希望能拦截另一个进程的所有陷入和异常,并能够即使知道他们的状态改变 进程间通信的发展 管道 System V进程间通信 POSIX进程间通信...,所有进程的通信会有不同的种类 进程间通信分类 管道: 匿名管道 pipe管道 System V IPC System V 消息队列 System V 共享内存 System V 信号量 POSIX...如果此时有创建了子进程,子进程会继承父进程的文件描述表,指向同一个文件,我们把上面分子进程都看到的文件,叫做管道文件,管道只允许单向通信,管道里的内容不需要刷新的磁盘。...返回值:成功返回0,失败返回错误代码 匿名管道的特性 面向字节流 用来进行具有血缘关系的进程,进行进程间通信(IPC) 文件的生命周期,随进程!管道也是!...(同步互斥就是指对于同一个管道,同一时刻只允许一个进程或者线程进行操作,对于保证管道的正确性和稳定性都非常重要它使得多个进程或者线程在有序安全的前提下去利用管道进行有效的数据传输和通信) 使用管道通信的

    10810

    Linux :进程间通信之管道

    ,导致现在很多Linux发型版本都不一样,即使一样,内部的标准也不一样!        ...进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。...管道的使用和文件一致,迎合了“Linux一切皆文件思想”。...——>这样是继承而不是通信,因为我们要拿到的数据可能是会变化的,这样通信才有意义  2.4 匿名管道的特征 1、具有血缘关系的进程进行进程间通信 2、管道只能单向通信(实现双向通信就必须有两个管道) 3...5、管道是有固定大小的(Linux中是64KB)且具有原子性,但是在不同的内核里可能有区别   验证管道大小: 最后写到65536说明管道大小是64kb  ulimit 命令用于限制 shell 进程及其所创进程的资源使用

    7610

    Linux之进程间通信——管道

    前言 管道是Linux中最古老的进程间通信的方式,本文介绍了进程间通信的相关概念,主要介绍了匿名管道和命名管道。 一、进程间通信 1.概念 什么是进程间通信?...例如:子进程终止时,要通知父进程); 进程控制:有的进程希望完全控制另一个进程大的执行(例如:Debug进程)。...父进程创建子进程,子进程继承管道以及对管道的读写 父进程关闭读取端,子进程关闭写入端。自此父进程只能向管道中写入,子进程只能从管道中读取,完成了父子进程的单向通讯。...2.管道分类 管道根据是否具有文件名,分为匿名管道和有名管道。 1.匿名管道 通过父进程创建子进程,子进程继承文件地址的方式,让父子进程看到同一个内存级文件,该内存级文件没有名称,则就称为匿名管道。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    34831

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

    ) 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程具有独立性,所以不同进程间通信该如何通信呢?...进程间通信分类 Linux进程间通信可以分为以下几种分类: 匿名管道(Pipe):管道是一种半双工的通信机制,可以在同一个进程中的两个文件描述符之间传递数据。...信号量(Semaphore):信号量是一种用于进程之间同步和互斥的机制,可以用来控制对共享资源的访问。...匿名管道pipe   在Linux中,匿名管道(anonymous pipe)是一种常用的进程间通信机制。...在Linux系统中,可以使用以下系统调用接口创建匿名管道: #include int pipe(int pipefd[2]); 该函数会创建一个管道,并将相应的读取和写入文件描述符存储在

    11500

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

    本文主要介绍 管道 的原理与实现。 一、管道的使用 管道 一般用于父子进程之间相互通信,一般的用法如下: 父进程使用 pipe 系统调用创建一个管道。...前面介绍了 管道(pipe) 的使用,接下来将会介绍管道在内核中的实现方式。 本文使用 Linux-2.6.23 内核作为分析对象。 1....如下图所示: 在 Linux 内核中,使用了 16 个内存页作为环形缓冲区,所以这个环形缓冲区的大小为 64KB(16 * 4KB)。...管道对象 在 Linux 内核中,管道使用 pipe_inode_info 对象来进行管理。...readers:表示正在读取管道的进程数。 writers:表示正在写入管道的进程数。 waiting_writers:表示等待管道可写的进程数。 inode:与管道关联的 inode 对象。

    4.1K52

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

    命名管道介绍   匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用命名管道来做这项工作。   ...在Linux系统中,命名管道(也称为FIFO,First In First Out)是一种特殊的文件类型,它允许进程间进行通信。...与匿名管道不同,命名管道存在于文件系统中,并且可以被任何有适当权限的进程访问。命名管道提供了一种方法,使得不相关的进程能够通过预先定义好的路径来交换数据。 2....> /path/to/your/fifo 需要注意的是,如果此时没有其他进程正在读取该命名管道,则上述命令将会阻塞,直到有读者出现。 从命名管道读取数据 另一个进程可以从命名管道中读取数据。...删除命名管道 一旦不再需要命名管道,可以直接使用rm命令删除它: rm /path/to/your/fifo 记住,命名管道必须在没有任何进程打开的情况下才能被成功删除。

    13710

    Linux进程通信之管道解析

    ,下面是在 Linux 端运行命令行的一个截图: ?...如果试图向已经填满的管道写入,系统会自动阻塞。一个管道不能同时被两个进程打开。...那要如何使用管道在两个进程之间通信呢,我们可以使用 fork()创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个fd[0]与fd[1],两个进程就可以通过各自的fd写入和读取同一个管道文件实现进程通信了...image-20210704172243185 命名管道 命名管道又被称之为是 FIFO ,未命名的管道只能在两个相关的进程之间使用,而且这两个相关的进程还要又一个共同创建了他们的祖先进程,但是,通过...综上,也就是命名管道在进程中通信的一个例子。 小结 上述就是本次进程通信中关于管道的相关内容,其中就包括匿名管道以及命名管道,他们之间存在着差别吗,也各有各的应用,本次的分享就到这里啦~ ?

    1.4K10

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

    @TOC 命名管道 匿名管道只能用来进行进程间通信,让具有血缘关系的进程进行通信 让毫不相关的进程之间进行通信,就需要采用命名管道通信 因为该文件有文件名称的,而且必须要有,所以叫做命名管道 1....重定向到显示器中 最终在终端2中显示 hello world 而实际上 输出重定向和输入重定向 的启动都是进程,并且毫不相关 2....命名管道原理 要打开对应的文件,就会在操作系统内创建struct file对象,struct file对象有自己的缓冲区 由于0 1 2 分别被占用,所以3指向struct file对象 若有一个毫不相关的进程...当新创建一个进程时,引用计数就会变成2 此时两个进程指向同一份文件 目的是让两个进程之间进行通信,所以就不应该把数据刷到磁盘上, 应该把磁盘文件改为内存级的,不会进行刷盘,把它命名为管道文件 如何保证两个毫不相关的进程...文件的唯一性,使用路径表示的 让不同的进程通过文件路径+文件名看到同一个文件,并打开,就是看到了同一个资源 3.

    1.9K30

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

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

    40020

    Linux 的进程间通信:管道

    微博ID:orroz 微信公众号:Linux系统技术 前言 管道是UNIX环境中历史最悠久的进程间通信方式。本文主要说明在Linux环境上如何使用管道。...虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。...管道的分类和使用 Linux上的管道分两种类型: 匿名管道 命名管道 这两种管道也叫做有名或无名管道。匿名管道最常见的形态就是我们在shell操作中最常用的”|”。...这就是命名管道。 Linux系统无论对于命名管道和匿名管道,底层都用的是同一种文件系统的操作行为,这种文件系统叫pipefs。...上文说过,管道实际上就是内核控制的一个内存缓冲区,既然是缓冲区,就有容量上限。我们把管道一次最多可以缓存的数据量大小叫做PIPESIZE。

    8.4K21

    Linux进程间通信之管道

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

    2.6K80

    Linux进程间通信之管道

    进程控制: 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。...进程间通信的发展: 管道 System V进程间通信 POSIX进程间通信 进程间通信的分类:  管道 匿名管道 命名管道 System V IPC System V 消息队列 System...匿名管道: 匿名管道性质:  匿名管道仅支持父子间进程通信。...当我们创建一个进程,在linux系统中它被如下图进行管理: 我们再通过这个进程创建一个子进程,子进程继承父进程的代码和数据:  没错,此时我们的父子进程能看到同一份资源,我们可以模拟一下通信,父进程往缓冲区写入...2.读端进程不读,写端进程一直写,那么当管道被写满后,对应的写端进程会被挂起,直到管道当中的数据被读端进程读取后,写端进程才会被唤醒。

    9310

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

    今日更新了Linux进程间通信的内容 欢迎大家关注点赞收藏⭐️留言 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。...进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。...如果此时又创建了子进程,子进程会继承父进程的文件描述符表,指向同一个文件。我们把上面父子进程都看到的文件,叫管道文件。 管道只允许单向通信。 管道里的内容不需要刷新到磁盘。...(写的次数和读取的次数不是一一匹配的) 管道的通信模式,是一种特殊的半双工模式,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性...通过channel控制子进程 ctrlProcess(channels, 5); // 3. 回收管道和子进程. a. 关闭所有的写端 b.

    15910
    领券