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

【进程间通信】IPC、管道pipe、命名管道FIFO

③ 如果父进程关闭管道读端,子进程关闭管道写端,此时父进程可以向管道写入数据,子进程将管道中的数据读出,反之同理。...问题就在这里,虽然子进程已经变成了僵尸进程,但是父进程依然持有写端文件描述符,所以父进程就会认为还存在其他进程来写入管道,于是父进程就会等待写入,而不退出。...如果管道读端没有全部关闭 如果管道已满,write阻塞,(管道实际上是内核中的一个缓冲区,它是有大小的)。 如果管道未满,write将数据写入,并返回实际写入的字节数。...只能用于有血缘关系的进程间通信(父子、兄弟等有共同祖先的进程),有名管道可解决该问题。 三、FIFO命名管道 1. 什么是FIFO FIFO命名管道,也叫有名管道,来区分管道pipe。...实际上,创建一个FIFO命名管道的时候,内核会为FIFO(伪)文件开辟一个缓冲区,操作FIFO文件就相当于操作这个缓冲区,以此来实现进程间的通信,这种通信实际上就是文件读写的操作来实现的。

11610

linux系统编程之管道(三):命名管道FIFO和mkfifo函数

一、命名管道FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。...如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。...,mode_t mode); 二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。...命名管道由mkfifo函数创建,打开用open。 FIFO命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,这些工作完成之后,它们具有相同的语义。...三、命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开

3.7K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。...FIFO只是借用了文件系统(file system,命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。)来为管道命名。...写模式的进程向FIFO文件中写入,而读模式的进程从FIFO文件中读出。 当删除FIFO文件时,管道连接也随之消失。...FIFO读写规则 1.从FIFO中读取数据:约定:如果一个进程为了从FIFO中读取数据而阻塞打开了FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作 2.从FIFO写入数据:约定:如果一个进程为了向...FIFO写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。

    2.5K30

    匿名管道命名管道

    毫不相关的进程进程间通信::命名管道 命名管道 https://blog.csdn.net/2401_83427936/article/details/142603367​​​​​​​ 首先自己要用用户层缓冲区...mkfifo命名管道 1号手册是指令,。...2号系统调用接口 创建一个管道,p开头就是命名管道,并不会直接刷新到磁盘中,实际是个符号 这样会阻塞 这样会显示出来(先输入左边的,再输入右边的就会显示),左右两边是两个进程 >>追加写入的方式,但空间一直是...make一下生成两个可执行程序,因为是server控制的,所以要先运行server 运行后就会多一个myfifo命名管道 命名管道的删除 想删除这个myfifo用unlink(成功返回0 ,失败返回-...exit(FIFO_CREATE_ERR); } } ~Init() { //删除命名管道 int m = unlink(FIFO_FILE

    15110

    命名管道Linux

    管道是 毫不相关的进程进程间通信::命名管道 管道 首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里...mkfifo命名管道 1号手册是指令,。...2号系统调用接口 创建一个管道,p开头就是命名管道,并不会直接刷新到磁盘中,实际是个符号 这样会阻塞 这样会显示出来(先输入左边的,再输入右边的就会显示),左右两边是两个进程 >>追加写入的方式,但空间一直是...make一下生成两个可执行程序,因为是server控制的,所以要先运行server 运行后就会多一个myfifo命名管道 命名管道的删除 想删除这个myfifo用unlink(成功返回0 ,失败返回-...exit(FIFO_CREATE_ERR); } } ~Init() { //删除命名管道 int m = unlink(FIFO_FILE

    7110

    mkfifo - 创建FIFO(命名管道

    1、管道 我们来看⼀一条 Linux 的语句句 netstat -tulnp | grep 8080  学过 Linux 命名的估计都懂这条语句句的含义,其中”|“是管道的意思,它的作⽤用就是把前⼀一条命令的输出...如 果两个进程要进⾏行行通信的话,就可以⽤用这种管道来进⾏行行通信了了,并且我们可以知道这条竖线是没有名字 的,所以我们把这种通信⽅方式称之为匿匿名管道。...居然有匿匿名管道,那也意味着有命名管道,下⾯面我们来创建⼀一个命名管道。 mkfifo - 创建FIFO(命名管道) makefifo test 这条命令创建了了⼀一个名字为 test 的命名管道。...接下来我们⽤用⼀一个进程向这个管道⾥里里⾯面写数据,然后有另外⼀一个进程把⾥里里⾯面的数据读出来。...从上⾯面的例例⼦子可以看出,管道的通知机制类似于缓存,就像⼀一个进程把数据放在某个缓存区域,然后等 着另外⼀一个进程去拿,并且是管道是单向传输的。 这种通信⽅方式有什什么缺点呢?

    88120

    浅谈 windows 命名管道

    顾名思义,管道是一个有两端的对象。一个进程向管道写入信息,而另外一个进程从管道读取信息。进程可以从这个对象的一个端口写数据,从另一个端口读数据。...简单一点,可以通过命令行利用重定向符号直接把内容写入命名管道中 echo “test” > \\....举一个例子: 首先,我们在远程计算机开启一个管道 ? 使用本地计算机尝试往管道写入内容,此时会提示用户名密码不正确 ?...if (WriteFile(hPipe, buffer, strlen(buffer), &WriteNum, NULL) == FALSE) { cout << "数据写入管道失败...管道的每一个终端都有从另一个终端读取和写入的能力,即,将 Payload 运行(注入)后,创建了自定义命名管道(作服务端),等待连接即可,这一过程被称为 " 绑定 "(Bind)连接。

    9.9K30

    linux 命名管道实例详解

    linux进程间通信——命名管道 FIFO命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中。...命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。...值得注意的是,FIFO(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出。 创建命名管道的系统函数有两个:mknod和mkfifo。...:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于⽂件创建的种类,它只在创建设备⽂件时才会⽤到。...下⾯使⽤mknod函数创建了⼀个命名管道: umask(0); if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1) { perror("mkfifo error

    4.1K21

    Linux进程间通信--管道(pipe和fifo)

    pipe        首先先来说一下pipe,这是一个匿名管道(为啥叫匿名呢,下面讲命名管道的时候就知道了),实现方式是循环队列,它只能用于有血缘关系的进程间通信。...当读管道时,如果管道中没有数据,则会阻塞,直到管道另一端写入数据。           2....当管道读端关闭时,如果写端在写入数据时,产生SIGPIPE信号,写进程默认情况下会终止进程。        ...fifo        fifo用来创建一个命名管道,可以解决非血缘关系的进程间通信,它的底层的实现原理和匿名管道相同,只不过是生成了一个可见的管道文件。...因为这个管道有一个所有进程都可以访问到的管道文件,所以fifo叫做命名管道,那么同理,pipe就只能通过fork的方式来复制文件描述符表来共享管道,而其他的进程却访问不到,所以叫做匿名管道

    3.7K30

    Linux命名管道及函数

    管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。...命名管道的创建 命令方式 在shell中可以使用mkfifo命令创建一个命名管道,格式为: mkfifo [option] name 其中option选项用于选择创建FIFO的模式,使用形式为-m mode...”的命名管道。...命名管道的读写 一般的文件I/O函数均可用于FIFO操作,如open、close、read、write等,若要删除一个命名管道,则使用系统调用unlink。...测试之前先使用mkfifo命令创建一个名为fifo1的命名管道: mkfifo -m 666 fifo1 然后打开两个shell窗口,依次运行write_fifo和read_fifo两个程序。

    2.7K10

    红队 | Windows命名管道

    .当一个进程往Piple当中写入信息时,另一个进程便可以从这个Pipe读出这个信息。...因此管道客户端Pipe Client要想连接管道服务端Pipe Server,就必须得知道服务端的管道名称。 命名管道的创建与访问 创建命名管道只能在本机上创建,且得具有一定的权限。...\\pipe\\") 命令可以查看到我们创建的SD命名管道 ? 命名管道的访问 虽然命名管道支持跨计算机跨网的访问连接,但是会受到访问控制列表(ACL)或者说本地策略限制。...命名管道还常被用作 C2 信道,通讯执行命令。 如图所示,每个终端将为每个直接连接的子终端提供一个命名管道服务器和一个命名管道客户端。服务器监听管道名称,并等待客户端的连接。...管道的每一个终端都有从另一个终端读取和写入的能力,即,将 Payload 运行(注入)后,创建了自定义命名管道(作服务端),等待连接即可,这一过程被称为 " 绑定 "(Bind)连接。

    2K20

    【Linux】 管道扩展 — 开始使用命名管道

    命名管道的功能实现 1 命名管道的原理 2 代码实现 2.1 系统调用 2.2 命名管道的封装 2.3 开始使用 3回归概念 Thanks♪(・ω・)ノ谢谢阅读!!! 下一篇文章见!!!...这是因为当读端退出了,操作系统会自动释放写端进程,操作系统不会做无用功(不会在一个没有读取的管道文件了一直写入) 当然这样的通信也就只能用来演示,我们先要通过命名管道来使我们创建的两个毫不相干的进程完成通信工作...,我们在写一下相应的函数: 读取 ReadNamedPipe(std::string *out) 设置缓冲区 从管道里读取 向缓冲区写入数据 命名管道对于读端而言 , 如果我们打开文件,但是写端还没有...&& write fd没有关闭: 读取条件不具备,读取进程会被阻塞 – wait 等待条件具备(写入了数据) 3回归概念 总结一下,命名管道的通信原理依然是:让两个不同的进程看到同一份资源(通过文件路径...如果我们想在不相关的进程之间交换数据,可以使用命名管道(FIFO文件)来做这项工作.

    9410

    Linux进程间通信【命名管道

    umask 掩码计算 不难发现,mkfifo 和 mkdir 非常像,其实 mkfifo 可以直接在命令行中运行 创建一个名为 fifo命名管道文件 mkfifo fifo 成功解锁了一种新的特殊类型文件...: echo 可以进行数据写入,可以重定向至 fifo cat 可以进行数据读取,同样也可以重定向于 fifo 打开两个终端窗口(两个进程),即可进行通信 当然也可以通过程序实现两个独立进程 IPC...服务端启动后,因为是读端,所以会阻塞等待 客户端(写端)写入数据 客户端写入数据时,因为 '\n' 也被读取了,所以要去除此字符 通信结束后,需要服务端主动删除管道文件 unlink 命令管道文件名 /...,这样就实现了文件的拷贝 目标:利用命名管道,向空文件 target.txt 中写入数据,即拷贝源文件 file.txt 公共资源 common.h #pragma once #include...char buff[1024]; int n = fread(buff, sizeof(char), sizeof(buff), fp); //IPC区域 // 4、写入源文件至命名管道

    34220

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

    @TOC 命名管道 匿名管道只能用来进行进程间通信,让具有血缘关系的进程进行通信 让毫不相关的进程之间进行通信,就需要采用命名管道通信 因为该文件有文件名称的,而且必须要有,所以叫做命名管道 1....见一见管道文件 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 ---- mkfifo fifo 制作一个管道 ,并命名fifo 文件类型以p开头...0,失败返回-1 ---- 管道文件的使用 将hello world 重定向到fifo管道中 但是好像并不会写入 fifo只代表一种符号,向符号写入消息并不会刷新到磁盘上,而是只会把hello world.../fifo";//管道名字为当前路径创建的fifo mode_t mode=0666;//默认权限为0666 这样 server文件和client文件就会调用同一份文件路径了 server.cc 服务端...创建一个管道文件 创建server.cc文件,使用mkfifo函数创建管道文件 ---- 此时运行可执行程序,即可生成fifo管道文件 ---- 权限变为664 ,可是在comm.hpp中设置的权限为

    1.9K30

    Windows进程间通信—命名管道

    大家好,又见面了,我是全栈君 命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。...与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。...命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。...命名管道服务器只能在WindowsNT或Windows2000上创建,不过可以是客户机。命名管道提供了两种基本通信模式,字节模式和消息模式。...服务端代码流程: 1、创建命名管道:CreateNamedPipe 2、等待客户端连接:ConnectNamedPipe 3、读取客户端请求数据:ReadFile 4、向客户端回复数据:WriteFile

    1.4K10

    【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现

    一、匿名管道命名管道的区别 匿名管道由pipe函数创建并打开。...命名管道由mkfifo函数创建,打开用open FIFO命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。...二、删除命名管道的函数 #include // 返回值:成功返回0,出错返回-1 int unlink(const char *pathname); pathname指创建出来的管道的路径和管道名...三、利用命名管道实现两个进程之间的简单通信  这个通信将实现写端发送信息读端接收信息。更多地实现细节会在代码中以注释的方式给出。.../fifo.txt" //定义命名管道结构体 class Fifo { private: string _name; // 文件路径加文件名 public: Fifo(const string

    14310

    通过命名管道分析检测 Cobalt Strike

    答案是:管道管道是用于进程相互通信的共享内存。基本上有两种类型的管道命名管道和未命名管道命名管道,顾名思义,有一个名字,可以通过引用这个名字来访问。...匿名管道,需要将其句柄传递给其他通信进程以交换数据。这可以通过多种方式完成。 Cobalt Strike 使用命名管道和未命名管道在信标与其牺牲进程之间交换数据。...命名管道 F-Secure 观察到,当使用 Cobalt Strike 的一些模块将反射 DLL 注入牺牲进程时,会创建一个具有可预测模式的命名管道。...请注意,这些命名管道不是用于横向移动的 SMB 命名管道,可以通过可塑性配置文件进行自定义。在 4.2 版之前,操作员无法修改此命名管道的名称。...NtWriteFile”函数上设置了一个断点,并且可以看到,牺牲进程试图写入的句柄与属于管道文件系统(Npfs)的未命名文件相关联: 正如我们所见,发现诸如“execute-assembly”之类的命令并不像上面那么简单

    1.6K20

    Python进程间通信之命名管道

    管道是一种简单的FIFO通信信道,它是单向通信的。 通常启动进程创建一个管道,然后这个进程创建一个或者多个子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信。...命名管道是对传统管道的扩展,默认的管道是匿名管道,只在程序运行时存在;而命名管道是持久化的,当不需要时需要删除它。 命名管道使用文件系统,由mkfifo()方法创建。...命名管道支持阻塞读和阻塞写操作: 如果一个进程打开文件读,它会阻塞直到另外一个进程写。 但是我们可以指定O_NONBLOCK选项来启用非阻塞模式。...命名管道必须以只读或者只写的模式打开,它不能以读+写的模式打开,因为它时单向通信。如果要实现双向通信,必须打开两个命名管道。...下面是一个 Python 使用命名管道来实现进程间通信的例子 Server 端 import os, time read_path = "/tmp/pipe.in" write_path = "/tmp

    3.8K100

    UNPv2第四章:管道FIFO

    filedes[0]为管道里的读取端 filedes[1]则为管道写入端 若成功则返回零,否则返回-1,错误原因存于errno中 ?...也就是说,它要么创建一个新的FIFO,要么返回一个EEXIST错误 管道FIFO的区别如下: 创建并打开一个管道只需要pipe,创建并打开一个FIFO则需要调用mkfifo再调用open 管道在将它打开着的进程中最后一个关闭它之后自动消失...对于管道而言是不可能的 5.管道FIFO的额外属性 下面是管道或者FIFO的读出与写入的若干额外规则: (1)如果请求读出的数据量多余管道或者FIFO的可用数据量,那么只返回可用数据量 (2)如果请求的数据字节小于等于...然而当一个管道FIFO设置成非阻塞时,来自wirte的返回值取决于待写的字节数以及管道FIFO当前可用空间的大小。...(i)如果还有1字节空间,那么内核写入管道FIFO能容纳数目的数据字节,该数目同时作为来自write的返回值  (ii)如果空间已满,那么立即返回EAGAIN 如果写入一个没有打开着用于读的管道或者

    50530
    领券