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

如何在Unix(或Windows)中使用(最好是未命名的)管道将一个进程的stdout发送到多个进程?

在Unix(或Windows)中,您可以使用管道(pipe)将一个进程的stdout发送到多个进程。这可以通过使用命名管道(named pipe)或匿名管道(unnamed pipe)来实现。

在这个例子中,我们将使用命名管道(named pipe),因为它允许多个进程同时读取和写入数据。命名管道在Unix系统中以/tmp/mypipe为例,在Windows系统中以\\.\pipe\mypipe为例。

以下是如何在Unix(或Windows)中使用命名管道将一个进程的stdout发送到多个进程的步骤:

  1. 创建命名管道:

在Unix系统中,您可以使用以下命令创建命名管道:

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

在Windows系统中,您可以使用以下命令创建命名管道:

代码语言:txt
复制
mkfifo \\.\pipe\mypipe
  1. 启动多个进程,让它们从命名管道读取数据:

在Unix系统中,您可以使用以下命令启动多个进程,让它们从命名管道读取数据:

代码语言:txt
复制
cat /tmp/mypipe | process1
cat /tmp/mypipe | process2

在Windows系统中,您可以使用以下命令启动多个进程,让它们从命名管道读取数据:

代码语言:txt
复制
type \\.\pipe\mypipe | process1
type \\.\pipe\mypipe | process2
  1. 将源进程的stdout发送到命名管道:

在Unix系统中,您可以使用以下命令将源进程的stdout发送到命名管道:

代码语言:txt
复制
source_process > /tmp/mypipe

在Windows系统中,您可以使用以下命令将源进程的stdout发送到命名管道:

代码语言:txt
复制
source_process > \\.\pipe\mypipe

这样,源进程的stdout将被发送到命名管道,然后多个进程将同时从该管道读取数据。

请注意,命名管道有一些限制,例如它们不能在网络上使用,并且可能受到操作系统限制。在某些情况下,您可能需要考虑使用其他技术,例如套接字(socket)或消息队列(message queue)。

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

相关·内容

Python与DBA

与文件系统交互 Python 用来与操作系统交互的核心库是 os 模块,您可以通过此模块处理系统进程、识别平台、处理操作系统管道以及使用环境变量 — 以 100 多个函数和变量的形式。...中,等等),非常有用的 shutil 模块实现高级文件系统操作,如复制和删除多个文件或整个文件树。 ..., mode,buffersize) 对给定 command 打开一个未命名管道,有效地实现与进程的进一步交互;mode 表示管道打开处理属性(默认为“r”,表示读取) os.spawn*(mode, ...清单 2 显示了 ps.py 程序的代码,此程序执行 ps aux 命令并将结果移到 Python 字典中。这里使用了一个管道来作为 stdout 的目标以捕获所有信息,并阻止输出到屏幕。...,如 stdin/stdout/stderr 描述符、用于设置进程工作目录的 cwd,或者设置子进程环境变量的 env。

1.1K10

linux——管道详解

管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。...写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入 数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。...实现与 Windows 相同的管道创建目标,Linux 和 UNIX 使用下面的代码片段: 创建 Linux 命名管道 if(pipe(fd1)) { printf("pipe() FAILED:...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。...我发现对于 Linux 上命名的和未命名的管道,结果是没有区别。

3K20
  • Linux进程通信 管道

    简介 管道是Unix系统IPC的最古老形式,所有Unix系统都提供这种形式。管道有以下两种局限性: (1)历史上,通信方式为半双工。现在某些系统提供全双工管道。...(2)管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使用了。(FIFO无此局限)。       ...PIPE PIPE是一种半双工管道,其中,fd[1]用来向管道写入数据,fd[0]用来从管道读出数据。若两个进程需要利用PIPE通信,就要保证一个进程使用fd[0],另一个进程使用fd[1]。...FIFO FIFO有时也会被称为命名管道,未命名的管道(PIPE)只能在两个相关的进程间使用,而且这个两个进程还要有共同的创建了它们的祖先进程。但是,通过FIFO,不相关的进程也能进行数据交换。...PIPE可称为“匿名管道”,无需命名,在具有亲属关系的进程中使用;FIFO又可称为“有名管道”,在使用过程中,其会在系统中创建FIFO类型文件,从而可通过此文件进行不相关进程间的通信。 通信方式。

    3.1K10

    python 标准类库-并行执行之subprocess-子进程管理

    因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是从当前进程中读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...类似在Unix上使用os.execvp(),Windows上使用CreateProcess()函数。 args 参数值为字符串、序列。默认的,如果args是个序列,程序会执行args中第一项。...\"被当作是字面字符 ",即转义字符 除非\后面跟了双引号,如\",否则还是被解释为字面字符 \ \\被解释为\,\\\"则被解释为一个 \和一个 " 字符 shell参数用于指明是否使用

    4.2K20

    WindowsAPI 之 CreatePipe、CreateProcess

    匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。...比如:将输出写入文件,又或者我们要将命令行程序输出结果显示到 Windows对话框中。 在Windows编程中,重定向需要用到管道(Pipe)的概念。管道是一种用于在进程间共享数据的机制。...比如,某网友写了一个重定向程序将stdout重定向到自己写的一个窗口中,就会产生如下的效果: 图片 先详细介绍一下管道,这里以匿名管道为例: 第一:匿名管道只能实现本地进程之间的通信,不能实现跨网络之间的进程间的通信...,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄,因为在子进程中必须要使用父进程创建的匿名管道的读写句柄,通过这个匿名管道才能实现父子进程的通信,所以必须继承父进程的公开句柄...()将管道的写句柄赋予标准输出(或标准错误)句柄。

    4.2K10

    Node.js 多进程(上)

    我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。...fork - child_process.fork 是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork('./son.js') 相当于 spawn('node', ['....与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。...默认: 在 UNIX 中为/bin/sh, 在 Windows 中为cmd.exe, Shell 应当能识别 -c开关在 UNIX 中,或 /s /c 在 Windows 中。...在Windows 中,命令行解析应当能兼容cmd.exe) timeout,数字,超时时间(默认: 0) maxBuffer,数字, 在 stdout 或 stderr 中允许存在的最大缓冲(二进制),

    67820

    python中的subprocess

    python2.7 源码中的注释(由于能力有限,翻译的不太准确): 这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。...程序通常执行序列或字符串的第一项,但可以通过使用明确的参数进行设置。 在UNIX上,shell = False(默认):在这种情况下,Popen类使用os.execvp()来执行程序的子进程。...如果参数是一个序列,第一项指定命令字符串,其他的将被视为附加的shell命令的参数。 在Windows:Popen类通过使用CreateProcess()执行这个子进程来对字符串操作。..., 但是在unix系统中会以\n结束,windows中以\r\n结束。...注意:读取的数据是保存在缓冲区中,因此,如果数据太大或没有限制则不要使用这个方法 下面的属性也是有效的: =====================  stdin     如果stdin参数是PIPE,

    1.6K30

    Linux进程

    管道(Pipes)和命名管道(Named Pipes): • 管道是最简单的IPC形式,允许一个进程和另一个进程进行通信,数据流是单向的。 • 匿名管道仅用于具有父子关系的进程间通信。...以下是一些常见的进程间通信方法及其在Go中的实现方式: 4.1 使用管道(Pipes) 虽然Go标准库中没有直接提供创建匿名管道的API,但你可以通过启动子进程时,使用os/exec包来实现父子进程间的管道通信...内存映射文件是一种将文件或文件的一部分映射到进程的地址空间的机制,这样,文件的内容就可以通过指针访问,就好像它是一个大的数组一样。...在Linux和Unix系统中,这通常通过mmap系统调用实现,而在Windows系统中,则通过CreateFileMapping和MapViewOfFile函数实现。...这种方式适用于需要高速访问大量数据的场景。 4.4 使用消息队列、信号量和共享内存 对于需要使用系统级IPC机制(如POSIX消息队列、信号量或共享内存)的场景,Go标准库中没有直接支持。

    7410

    python中执行DOS命令的3种方法小

    参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。...参数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用’/r/n’表示换,而Linux下用 ‘/n’。...参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。...向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。...使用commands.getstatusoutput方法 这个方法也不会打印出cmd在linux上执行的信息。这个方法唯一的优点是,它不是一个阻塞的方法。即没有Popen函数阻塞的问题。

    2.3K20

    Python用subprocess的Popen来调用系统命令

    可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出,推断该命令的执行状态,管理多个命令的并行等等。...假设是序列类型,第一个元素一般是可运行文件的路 径。我们也能够显式的使用executeable參数来指定可运行文件的路径。...假设将參数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。...向stdin发送数据,或从stdout和stderr中读取数据。可选參数input指定发送到子进程的參数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。...在异常对象中,包 括进程的returncode信息。 subprocess模块的内容就这么多。在Python手冊中,还介绍了怎样使用 subprocess来替换一些老的模块,老的函数的样例。

    1.9K20

    【linux学习指南】 进程间通信&&匿名管道&&理解管道的本质

    通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。...Unix/Linux 系统中,我们可以使用 fork() 系统调用来创建子进程,并通过共享管道(pipe)进行进程间通信。...通过这种方式,父进程和子进程可以通过共享的管道进行通信。父进程将数据写入管道,子进程从管道中读取数据。 这个过程中,父进程和子进程各自持有管道的一端文件描述符,确保了数据的正确流向。...从内核的角度来理解管道(pipe)的本质是很有帮助的。让我们深入探讨一下管道在内核中的实现: 内核中的管道实现: 在内核中,管道本质上是一个环形缓冲区,用于存储进程间传递的数据。...这种通信方式简单高效,是 Unix/Linux 系统中常见的进程间通信机制之一。 总的来说,从内核的角度看,管道本质上是一个由内核维护的环形缓冲区,用于在进程间传递数据。

    8410

    python之调用系统命令 原

    os.system("ls") 仅仅在一个子终端运行系统命令, 而不能获取命令执行后的返回信息 os.Popen 这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容...Popen.communicate(input=None) 与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。...,windows中是 \ os.extsepv 扩展名分隔符,windows中是 ....os.pathsep 扩展名分隔符,windows中是 ; os.linesep 字符串给出当前平台使用的行终止符。...例如,Windows使用'\r\n',Linux使用'\n' 而Mac使用'\r'。 换行分隔符,windows中是 \r\n 获得基本信息 os.name 字符串指示你正在使用的平台。

    2.3K40

    C和C++安全编码笔记:文件IO

    命名管道(named pipe)使不同的进程能够通信,并可以在文件系统中的任何地方存在。创建命名管道的命令是mkfifo,如mkfifo mypipe。它们用权限字符串中的第一个字母p来表示。...因此,特权位于用户、用户代理或替代,如UNIX进程中。权限是访问资源所必要的特权,因此它与资源(如文件)相关。特权模型往往是特定于系统且复杂的。...程序员经常在对所有用户都是可写(如UNIX上的/tmp和/var/tmp目录和Windows上的C:\TEMP)并可以定期清除(例如,每天晚上或重启时)的目录中创建临时文件。...这是一个危险的做法,因为一个在共享目录中的众所周知的文件很容易被攻击者劫持或操纵。缓解策略包括以下内容:(1).使用其它低级别的IPC(进程间通信)机制,如套接字或共享内存。...消除竞争窗口的技术:  (1).互斥缓解方案:UNIX和Windows支持很多能够在一个多线程应用程序中实现临界区的同步原语,包括互斥变量、信号量、管道、命名管道、条件变量、CRITICAL_SECTION

    98600

    python模块之subprocess类与常量

    stdin, stdout, stderr参数的特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数的特殊值,表示重定向标准错误到标准输出 Popen 在一个新的进程中执行子程序...如果是序列,则args中的第一个元素是要执行的程序;如果是字符串,解释执行与平台有关,在POSIX系统args将被解释为要执行的程序的名称或路径(前提是不传递任何参数给程序)。...唯一需要指定shell=True的场景是要执行的指令是shell内置的,如dir, copy。...子进程文件句柄继承自父进程。除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于子进程中的程序执行。...Windows系统上kill()是terminate()的别名 属性 args:传入Popen构造器的第一个参数,list或string类型 stdin:如果传递给Popen的stdin参数是PIPE,

    2.5K10

    python笔记65 - Python3 subprocess执行命令行获取返回结果

    前言 subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。 Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。...常用参数: args: shell命令,可以是字符串或者序列类型(如: str, list,元组) bufsize: 缓冲区大小。 当创建标准流的管道对象时使用,默认-1。...stdin, stdout, stderr: 分别表示程序的标准输入、输出、错误句柄 preexec_fn: 只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用...shell: 如果该参数为 True,将通过操作系统的 shell 执行指定的命令。...系统编码是gb2312 windows解码 知道windows系统的编码后,设置对应的编码,就可以正常解码了 import subprocess p = subprocess.Popen('java',

    9.3K20

    RoadRunner和PHP通信的工作原理

    本来也知道其工作原理,但是php仅支持命名管道,且windows下不支持命名管道。RoadRunner官方说默认就是管道,我想看看windows下如何实现,于是看了下源码。.../xxx.php 开启多个php命令行进程(2).当go进程接收到http消息,通过标准输入传递给php命令行进程(3).php读取进程的标准输入数据,php返回的数据写入到标准输出(4).go进程读取到...php进程的标准输出响应客户端当然roadRunner也支持TCP_SOCKET、UNIX_SOCKET通信方式交互phpphp-worker进程伪代码,php进程阻塞获取信息。...PHP_EOL);    }}这里我不太清楚从专业术语来讲标准输入输出是否算管道,但是和命名管道功能差不多。而且也不清楚这种方式的性能如何。...而nginx和fpm是通过TCP_SOCKET、UNIX_SOCKET,没有通过这种方式通信。

    46420
    领券