首页
学习
活动
专区
工具
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

使用python执行shell脚本 并动态传参 及subprocess使用详解

要执行程序通常是args序列字符串第一项,但可以使用可执行参数进行显式设置。...一个字符串将被视为一个字符串作为唯一项目(要执行程序)序列。 在UNIX上,使用shell = True:如果args一个字符串,则它指定要通过shell执行命令字符串。...在Popen对象,可以设值subprocess.stdout=PIPE 即通过管道 p.stdout.read()取出 该进程标准输出 preexec_fn 如果preexec_fn设置为可调用对象...如果设置universal_newlines为true,则文件对象stdout和stderr将作为文本文件打开,但可能会有\ n,Unix行尾约定\ r,Macintosh约定\ r \ n任何行终止...返回一个元组(stdout,stderr) 但是读取数据缓存在内存,所以如果数据量很大或者无限,就不要使用这种方法 Popen.pid 返回子进程pid Popen.returncode 读取进程状态码

5.3K30

linux——管道详解

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

2.9K20

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

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

3.9K20

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

WindowsAPI 之 CreatePipe、CreateProcess

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

3.8K10

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 中允许存在最大缓冲(二进制),

66020

pyinstaller打包成无控制台程序时运行出错(与popen冲突解决方法)

有时候我们需要在程序里执行一些cmd命令,使用os或者其它模块popen方法去执行 这个问题一般程序内有输入导致,这个输入可以是input(),也可以是其它一些stdin操作(os.popen...经过研究,上结论: os.popen 会打开一个管道执行命令,而管道有输入(stdin)、输出(stdout) !...如果PIPE,则表示需要创建一个管道,如果 None,不会做任何重定向工作,子进程文件描述符会继承父进程。...(仅限Windows) 再解释一下两个我们后面要用到东西: subprocess.PIPE 一个可以用于Popenstdin、stdoutstderr参数特殊值,它指示应打开到标准流管道。...这个简单封装,改成使用subprocess.popen,接着subprocess.popen打开管道输入值(stdin)重定向,即可解决问题!

3.6K30

pythonsubprocess

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标准库没有直接支持。

4910

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函数阻塞问题。

2K20

Python用subprocessPopen来调用系统命令

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

1.7K20

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.2K40

Python学习之os模块及用法

一般在 Windows 系统上多条路径之间分隔符英文分号(;);在 UNIX 及类 UNIX 系统( Linux、Mac os X)上多条路径之间分隔符英文冒号(:)。...在 UNIX 系统上,默认行为生成内核转储;在 Windows 系统上,进程立即返回退出代码 3。...os.forkpty():fork一个进程。 os.kill(pid, sig): sig 信号发送到 pid 对应过程,用于结束该进程。...os.killpg(pgid, sig): sig 信号发送到 pgid 对应进程组。...注意 如果读写文件的话,建议使用内置函数open(); 如果路径相关操作,建议使用os子模块os.path; 如果要逐行读取多个文件,建议使用fileinput模块; 要创建临时文件路径,建议使用

2.5K40

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构造器一个参数,liststring类型 stdin:如果传递给Popenstdin参数PIPE,

2.4K10

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

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

90900

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',

8.5K20
领券