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

在mono/Linux下从命名管道读/写

在 Linux 下,命名管道(named pipe)是一种特殊类型的文件,用于在不同进程之间进行数据传输。命名管道有两种类型:FIFO 和 socketpair。

从命名管道读取数据的方法是使用 open() 系统调用打开管道,然后使用 read() 系统调用从管道中读取数据。例如:

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

int main() {
    int fd;
    char buf[1024];

    // 打开命名管道
    fd = open("my_pipe", O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(1);
    }

    // 从管道中读取数据
    int n = read(fd, buf, sizeof(buf));
    if (n < 0) {
        perror("read");
        exit(1);
    }

    // 输出读取到的数据
    printf("Read %d bytes from the pipe: %s\n", n, buf);

    // 关闭管道
    close(fd);

    return 0;
}

从命名管道写入数据的方法是使用 open() 系统调用打开管道,然后使用 write() 系统调用向管道中写入数据。例如:

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

int main() {
    int fd;
    char buf[] = "Hello, world!";

    // 打开命名管道
    fd = open("my_pipe", O_WRONLY);
    if (fd < 0) {
        perror("open");
        exit(1);
    }

    // 向管道中写入数据
    int n = write(fd, buf, sizeof(buf));
    if (n < 0) {
        perror("write");
        exit(1);
    }

    // 关闭管道
    close(fd);

    return 0;
}

需要注意的是,命名管道是一种同步 I/O 方式,如果读取或写入的进程没有准备好,则会阻塞。如果需要异步 I/O,则需要使用其他方式,例如使用套接字(socket)进行通信。

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

相关·内容

linux——管道详解

注意:管道读数据是一次性操作,数据一旦被,它就从管道中被抛弃,释放空间以便更多的数据。 1....2.管道的读写       管道实现的源代码fs/pipe.c中,pipe.c中有很多函数,其中有两个函数比较重要,即管道函数pipe_read()和管道函数pipe_wrtie()。...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的操作将被阻塞。 实际上这算不上什么限制,因为操作是不同的线程中实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux命名管道和 Windows 的命名管道。我写了另一个 Linux 上使用命名管道的程序。...我发现对于 Linux命名的和未命名管道,结果是没有区别。

2.9K20

零教你Linux环境(ubuntu)如何编译hadoop2.4

master:~$ tar zxvf hadoop-2.4.0-src.tar.gz 解压完毕,我们会看到相应的文件夹: 三、解压完毕,我们开始准备编译所需要的软件 这里软件的准备,很多文章的都不全...,这里整理一。...这里需要说明的是有的Linux有自带的这些工具,这个需要仔细看一版本是否匹配,不匹配则升级一,有些不能升级,那么就重装一吧 1、jdk的安装 步骤下载压缩包、解压、配置环境变量 (1)jdk下载...链接: http://pan.baidu.com/s/1jGr41SU 密码: rawv (2)jdk解压 tar zxvf jdk-7u51-linux-x64.tar.gz 然后重命令为:...上面准备工作已经做的差不多了,我们终于可以开始,记得进入src文件夹下,输入下面命令 mvn package -Pdist,native -DskipTests -Dtar 等了40多分钟,ok 目录

1.1K110

Linux 的进程间通信:管道

pipefd[0]是方式打开,作为管道描述符。pipefd[1]是方式打开,作为管道描述符。管道端写入的数据会被内核缓存直到有人另一端读取为止。...,并且对管道写了一个字符串之后管道读取,并打印标准输出上。...使用同一个管道的父子进程可以分时给对方发送消息。我们也可以看到对管道读写的一些特点,即: 管道中没有数据的情况,对管道操作会阻塞,直到管道内有数据为止。...当一次的数据量不超过管道容量的时候,对管道操作一般不会阻塞,直接将要写的数据写入管道缓冲区即可。 当然操作也不会再所有情况都不阻塞。这里我们要先来了解一管道的内核实现。...Linux 2.6.35之后,fcntl系统调用方法中实现了F_GETPIPE_SZ和F_SETPIPE_SZ操作,来分别查看当前管道容量和设置管道容量。

8.3K21

UNIX(进程间通信):09 管道到底是什么

注意:管道读数据是一次性操作,数据一旦被,它就从管道中被抛弃,释放空间以便更多的数据。 1....2.管道的读写 管道实现的源代码fs/pipe.c中,pipe.c中有很多函数,其中有两个函数比较重要,即管道函数pipe_read()和管道函数pipe_wrtie()。...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。除非阅读器清空管道,否则一次超过 4K 的操作将被阻塞。实际上这算不上什么限制,因为操作是不同的线程中实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux命名管道和 Windows 的命名管道。我写了另一个 Linux 上使用命名管道的程序。...我发现对于 Linux命名的和未命名管道,结果是没有区别。

1.2K10

Linux进程间通信【命名管道

:p 管道文件 出自:Linux 权限理解和学习 这个管道文件也非常特殊:大小为 0,侧面说明 管道文件就是一个纯纯的内存级文件,有自己的上限,出现在文件系统中,只是单纯挂个名而已 可以直接在命令行中使用命名管道...,将服务器看作端,自己的电脑看作端,那么 下载 这个动作本质上就是 IPC,不过是在网络层面实现的 我们可以利用 命名管道实现不同进程间 IPC,即进程文件中读取并写入一批数据,另一个进程一次读取一批数据并保存至新文件中...,无论先启动端,还是先启动端,都要阻塞式的等待另一方进行交互 3.2、实现进程控制 Linux 匿名管道 IPC 中,我们实现了一个简易版的进程控制程序,原理是通过多条匿名管道实现父进程对多个子进程执行任务分配...的具体实现可以看看这篇文章 《Linux模拟实现【简易版bash】》 步骤: 创建命名管道 将 bash 改装,打开命名管道文件,作为 端 创建独立进程,打开命名管道文件,作为 端 进行 IPC,发送命令给...》 ---- 总结 以上就是本次关于 Linux 进程间通信之命名管道的全部内容了,作为匿名管道的兄弟,命名管道具备匿名管道的大部分特性,使用方法也基本一致,不过二者创建和打开方式上各有不同:匿名管道简单

24820

Linux系统中各种文件类型

一、文件类型的简称辨别: 1、Linux系统中的各种文件类型之前,我们先从平时我们Linux系统用命令ls -l 查看到的一些文件信息,不知道你有没有注意下面的图片中的细节: 注意画红线的地方...管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存中传输的,管道是进程间通信的一种方式,例如父进程,子进程。...shell中匿名管道就是一个管道符号"|",例如ls | grep xxx,其中ls对应的进程是这个独立进程组中的父进程,grep对应的进程是子进程,父进程子进程。...shell中,可以使用mknod命令或mkfifo命令创建命名管道某些特殊需求的shell脚本时,命名管道非常有用。...一般的管道都是单向通信的,无法实现双向通信的功能,也就是只能一边写一边,不能两边都能读、。如果要实现双向通信,可以创建两根管道(这样就有4个文件句柄,两个端,两个端),或者使用更方便的套接字。

2.5K10

对线面试官 - 网络面试之进程间的通信

派大星:可以的,主要方式为:管道命名管道、消息队列、共享内存。 面试官:可以简单介绍一这些通信方式吗? 派大星:好的。...管道中的数据一旦被读取出来,就不在管道里面了。但是如果管道满了,那么管道的操作就阻塞了,直到别人读了管道的数据;反之如果管道是空的,那么操作的管道就阻塞了。...管道是半双工的,就是数据只能流向一个方向,就比如说你架设一个管道,只能一个进程,一个进程。...但是命名管道是有名字的。这个命名管道相当于是有一个名字的文件,是有路径的。所以没有血缘关系的进程都可以通过这个命名管道来进行通信,名字文件系统上,数据在内存里。...其它的和管道一样:一个进程,一个进程。也是半双工。数据只能单向滚动 然后聊聊: 消息队列 Linux的消息队列可以认为是一个链表结构。

12310

Linux进程间通信【匿名管道

匿名管道命名管道,两者绝大部分原理、特点都一致,本文主要介绍 匿名管道,同时适用于 命名管道 的知识点统一称为 管道 Linux 中一切皆文件,所以管道本质上就是一个文件 ---- 3、管道的工作原理...管道的工作原理其实很简单:打开一个文件,让两个进程分别享有端与端 fd,对文件进行操作即可 命名管道和匿名管道基本原理都差不多,但命名管道更强大,能实现两个毫不相干的进程间通信 具体 OS 中的体现...,拿数据按报文段拿 不论端写入了多少数据,只要写端停止写入,端都可以将数据读取 5.具有一定的协同能力,让 端 和 端 能够按照一定的步骤进行通信(自带同步机制) 当端进行管道中读取数据时,...i386 平台中,管道大小为 4096 字节,即 4kb), Linux 2.6.11 开始,管道大小的容量统一为 65536 字节,即 64kb 因为 Linux 2.6.11 版本中,对管道进行更新...,极大提高了效率 三、通过程序验证 这个前面就已经验证过了,不断往管道数据,直到管道满 每次写入 1 字节的数据,可以看到最终写了 65536 字节的数据 总之, Linux 2.6.11

22620

Linux】进程间通信详解

管道自带同步与互斥机制,同步与互斥,将放在后面章节讲解) 命名管道通信 命名管道通信原理 实际上与匿名管道原理相同,创建一个管道文件,然后让不同的进程分别以的方式打开,然后实现通信。...当然,这种命名管道也遵循管道通信的四大现象,比如假如我将端关闭,那么此时端进程就成了无意义的写入,OS不会进行维护,就会就发送13号信号,终止端进程。...举个例子,A进程以的方式打开命名管道,那么此时A进程就会进入阻塞,直到B进程以的方式打开该管道文件,A才继续运行。  ...同样,假如A以的方式打开命名管道,此时A也会进入阻塞,直到B进程以的方式打开管道文件,A才继续运行。.../shm.h、shm_perm存在于/usr/include/linux/ipc.h) 通信步骤 整体来说,分为:1、创建共享内存。

31020

进程间通讯的7种方式是_第一种形态有哪些方式

(pipe文件) 管道机制需要提供一几点的协调能力 1.互斥,即当一个进程正在对pipe执行/操作时,其它进程必须等待 2.同步,当一个进程将一定数量的数据写入,然后就去睡眠等待,直到读进程将数据取走...3.2 无名管道 pipe的例子:父进程创建管道,并在管道中写入数据,而子进程管道读出数据 3.3 命名管道 和无名管道的主要区别在于,命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点,有了这个文件名...例子:用命名管道实现聊天程序,一个张三端,一个李四端。两个程序都建立两个命名管道,fifo1,fifo2,张三fifo1,李四fifo1;李四fifo2,张三fifo2。...对消息队列有权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有权限的进程可以消息队列中读取消息。...Linux 的信号量函数都是通用的信号量数组上进行操作,而不是一个单一的二值信号量上进行操作。

43720

Linux文件类型

一.简介 Linux系统,有七类文件类型: 普通文件(-) 目录(d) 软链接(字符链接L) 套接字文件(S) 字符设备(S) 块设备(B) 管道文件(命名管道P) 普通文件、目录、软链接无需多解释...二.详解 管道文件 管道分为匿名管道命名管道管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存中传输的,管道是进程间通信的一种方式,例如父进程,子进程。...shell中匿名管道就是一个管道符号”|”,例如ls | grep xxx,其中ls对应的进程是这个独立进程组中的父进程,grep对应的进程是子进程,父进程子进程。...shell中,可以使用mknod命令或mkfifo命令创建命名管道某些特殊需求的shell脚本时,命名管道非常有用。...但是真正可以网络套接字之前,网路套接字还需要一些设置。

3K10

Linux系统编程-进程间通信(管道)

进程间通信方式介绍 这篇文章介绍Linux进程的间的通信方式,常用的方式如下: 1. socket—网络通信 2. 管道---无名管道命名管道---文件--FIFO 3. 消息队列 4....无名管道的特点: 只能在亲缘关系进程间通信(父子或兄弟) 半双工(固定的端和固定的端) 虚拟管道文件是一个存在内存的特殊文件,可以用read、write函数进行操作。...这里说的管道,就像一条水管,有两个端口,一端进水,另一端出水。管道也有两个端口,分别是端和端,进水可看成数据端被写入,出水可看数据端被读出。程序里分别就对应了read和write函数。...创建无名管道:得到管道读写文件描述符 fds[0]和端相对应, fds[1]和端相对应*/ pipe(fds); /*2....命名管道 无名管道只能在亲缘关系的进程间通信大大限制了管道的使用,有名管道突破了这个限制,通过指定路径名的形式实现不相关进程间的通信,因为命名管道通信使用的管道是一个实体文件,磁盘上的存在的,而无名管道是存在内存中的虚拟文件

1.2K50

Linux进程间通信之管道

当我们创建一个进程,linux系统中它被如下图进行管理: 我们再通过这个进程创建一个子进程,子进程继承父进程的代码和数据:  没错,此时我们的父子进程能看到同一份资源,我们可以模拟一通信,父进程往缓冲区写入...1.父进程用pipe函数创建管道。 2.父进程通过fork函数创建子进程。 3.假设我们让子进程,父进程,所以我们要关闭不用的文件描述符,父进程关闭端,子进程关闭端。  ...2.端进程不读,端进程一直写,那么当管道满后,对应的端进程会被挂起,直到管道当中的数据被端进程读取后,端进程才会被唤醒。...4.端进程将端关闭,而端进程还在一直向管道写入数据,那么操作系统会将端进程杀掉。...从上图可以算出管道的大小为512*8 = 4096字节。  命名管道: 刚才介绍的匿名管道,只可用于父子进程间通信,如果两个毫不相干的进程要实现通信该怎么办呢?接下来就需要介绍一命名管道了。

7810

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

我们来尝试通信一: 此时两个不同的进程就可以进行通信!!! 我们让两个进程保持一直通信的状态,这样端可以一直获取数据! 当我们突然关闭右侧端时,左边的端就直接退出来了!...这是因为当端退出了,操作系统会自动释放端进程,操作系统不会做无用功(不会在一个没有读取的管道文件了一直写入) 当然这样的通信也就只能用来演示,我们先要通过命名管道来使我们创建的两个毫不相干的进程完成通信工作...2.2 命名管道的封装 首先我们来认识一创建管道的系统调用: MKFIFO(3) Linux...); } int OpenForWrite() { return OpenNamedPipe(Write); } 打开文件之后就是进行读取或者写入,我们相应的函数...: 读取 ReadNamedPipe(std::string *out) 设置缓冲区 管道里读取 向缓冲区写入数据 命名管道对于端而言 , 如果我们打开文件,但是端还没有,就会阻塞在open

6710

进程间通信

匿名管道 #include 功能:创建一无名管道 原型: int pipe(int fd[2]); 参数: fd:文件描述符数组,其中fd[0]表示端, fd[1]表示端...当管道满的时候 O_NONBLOCK disable: write调用阻塞,直到有进程走数据 O_NONBLOCK enable:调用返回-1,errno值为EAGAIN 如果所有管道端对应的文件描述符被关闭...,则read返回0 如果所有管道端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性...命名管道是一种特殊类型的文件 创建一个命名管道 命名管道可以从命令行上创建,命令行方法是使用下面这个命令: $ mkfifo filename 命名管道也可以程序里创建,相关函数有: int mkfifo...命名管道的打开规则 如果当前打开操作是为而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为而打开

99720

Linux进程通信之管道解析

匿名管道 默认情况 Shell命令执行过程中,任何一个命令都有一个标准输入设备(键盘)、标准输出设备(显示器)和标准输出设备(显示器),使用管道"|"可以将两个命令连接起来,从而改变标准的输入输出方式...,下面是 Linux 端运行命令行的一个截图: ?...下面是一个使用命名管道进行进程间通信的例子,例子分为两个程序,分别是部分和部分,首先看先往管道数据的代码,代码如下所示: #include #include <string.h...image-20210706132916572 说明一,就是说当运行 write程序的时候,会创建fifo文件,命名管道,然后, write文件中就执行open操作,但是,这里存在的一个问题就是,因为在运行...综上,也就是命名管道进程中通信的一个例子。 小结 上述就是本次进程通信中关于管道的相关内容,其中就包括匿名管道以及命名管道,他们之间存在着差别吗,也各有各的应用,本次的分享就到这里啦~ ?

1.4K10

C++进程间通信 详解2

一、概述 二、进程间通信概念及方法 Linux环境,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量另一个进程中都看不到,所以进程和进程之间不能相互访问。...进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。...有如下特质: 1) 其本质是一个伪文件(实为内核缓冲区) 2)由两个文件描述符引用,一个表示端,一个表示端。 3) 规定数据管道端流入管道端流出。...4)如果有指向管道端的文件描述符没关闭(管道端引用计数大于0),而持有管道端的进程也没有管道中读数据,这时有进程向管道数据,那么管道满时再次write会阻塞,直到管道中有空位置了才写入数据并返回...注意: ls命令正常会将结果集写出到stdout,但现在会写入管道端; wc -l 正常应该stdin读取数据,但此时会管道

31010

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

关于管道的读写 管道实现的源代码fs/pipe.c中,pipe.c中有很多函数,其中有两个函数比较重要,即管道函数pipe_read()和管道函数pipe_wrtie()。...管道函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据,而管道函数则通过复制物理内存中的字节而读出数据。...为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。...FIFO只是借用了文件系统(file system,命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。)来为管道命名。...模式的进程向FIFO文件中写入,而模式的进程FIFO文件中读出。 当删除FIFO文件时,管道连接也随之消失。

2.3K30

详解管道

我们让父进程进行,那么就关闭其的那个文件描述符,让子进程,那么就关闭其的那个文件描述符。这样,父子进程间就能够就行通信了。这样通信方式我们叫做匿名管道管道的本质是一种文件。...,端不会继续,而是停下来等待写入。...当我们让快,慢时(即时休眠时间长一些)一次会将管道中的所有数据都读出来。管道的大小是有限制的,当管道满时,便不会再写,而是等待读。当把端关掉,端进程会直接退出。...管道读数据是一次性操作,数据一旦被,它就从管道中被抛弃,释放空间以便更多的数据。站在内核的角度,管道的本质就是两个进程对同一个文件对象,一个进行写入,一个进行读取。...:命名管道与匿名管道的原理相同,都是通过让两个进程看到同一份资源,从而实现通信,但命名管道不再局限于父子进程之间,而是任意两个进程之间实现通信。

28551
领券