使用管道与程序进程通信

     2023-02-16     134

关键词:

【中文标题】使用管道与程序进程通信【英文标题】:Communicating with program process using pipes 【发布时间】:2013-02-09 13:40:59 【问题描述】:

我希望在从 Golang 程序生成某些程序后能够与它们完全通信。我已经拥有的是根据从 stdout 读取的最后一行生成进程并通过管道进行对话:

package main

import (
    "fmt"
    "io"
    "log"
    "os/exec"
    "strings"
)

var stdinPipe io.WriteCloser
var stdoutPipe io.ReadCloser
var err error

func main() 
    cmd := &exec.Cmd
        Path: "/Users/seba/Projects/go/src/bootstrap/in",
        Args: []string"program",
    

    stdinPipe, err = cmd.StdinPipe()

    if err != nil 
        log.Fatal(err)
    

    stdoutPipe, err = cmd.StdoutPipe()

    if err != nil 
        log.Fatal(err)
    

    err = cmd.Start()

    if err != nil 
        log.Fatal(err)
    

    var stdoutLines []string
    go stdoutManage(stdoutLines, stdoutController)

    cmd.Wait()


// TODO: imporove as in io.Copy
func stdoutManage(lines []string, manager func(string)) 
    buf := make([]byte, 32*1024)

    for 
        nr, err := stdoutPipe.Read(buf)

        if nr > 0 
            thelines := strings.Split(string(buf), "\n")
            for _, l := range thelines 
                manager(l)
                lines = append(lines, l)
            
        

        buf = make([]byte, 32*1024) // clear buf

        if err != nil 
            break
        
    

但是,这种方法在清除终端输出的程序和以某种方式缓冲标准输入或根本不使用标准输入的程序存在问题(不知道是否可能)。

那么问题是:是否有一种与程序交谈的可移植方式(可以是非 Golang 解决方案)?

【问题讨论】:

【参考方案1】:

此类问题通常与 C library which changes its default buffering 模式有关,具体取决于 stdin / stdout / stderr 是什么。

如果 stdout 是终端,则缓冲自动设置为行缓冲,否则设置为缓冲。

这与您有关,因为当您通过管道运行程序时,它们没有连接到终端,因此会有缓冲,这会扰乱这种使用。

要解决这个问题,您需要使用一个伪 tty,它假装是一个终端,但行为就像一个管道。这是一个实现 the pty interface 的库,我实际上没有尝试过,但它看起来是正确的!

【讨论】:

使用 stdout/stderr 以外的管道与子进程通信

】使用stdout/stderr以外的管道与子进程通信【英文标题】:Communicatewithasubprocessusingpipesonotherthanstdout/stderr【发布时间】:2015-02-1317:46:43【问题描述】:这就是我fork/exec一个子进程并与之通信的方式(伪代码):intcout_pipe[2];pipe(cout_... 查看详情

为啥我不能重用管道与多个子进程通信?

...问题描述】:如果我的父进程有n子进程,为什么我不能使用一个管道将父进程的pid发送到所有子进程?这在post中有简要介绍,但我觉得解释的不是很清楚。这是我的代码:#include 查看详情

Linux 中使用管道的进程间通信

】Linux中使用管道的进程间通信【英文标题】:InterprocesscommunicationusingpipeinLinux【发布时间】:2013-08-1005:48:09【问题描述】:我已经编写了用于在linux中写入数字以进行管道传输的代码。如下,但显示错误,谁能帮我解决这个问题... 查看详情

linux命令管道工作原理与使用方法

...向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初UnixIPC形式之一,具有以下特点:***数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需... 查看详情

在不破坏管道的情况下与进程多次通信?

...不是我第一次遇到这个问题,而且真的很困扰我。每当我使用Pythonsubprocess模块打开管道时,我只能使用它一次communicate,如文档所述:Readdatafromstdoutandstde 查看详情

在 C# 中使用管道在进程之间进行通信

】在C#中使用管道在进程之间进行通信【英文标题】:CommunicatingbetweenProcessesusingPipesinC#【发布时间】:2013-05-2816:16:25【问题描述】:我正在写两个程序第一个程序向第二个程序发送文本消息。第二个程序将所有消息写入指定文件... 查看详情

操作系统综合实验1

...深操作系统的进程控制和shell接口的认识。二、实验内容使用Linux操作系统;学习使用Linux进程间控制,进程间通信,管道,消息队列,共享内存等手段以及处理机调度学会使用POSIX信号量实现生产者与消费者间... 查看详情

如何使用管道/excel最好地构建4个进程之间的进程间通信?

】如何使用管道/excel最好地构建4个进程之间的进程间通信?【英文标题】:Howtobeststructureinter-processcommunicationbewteen4processeswithpipes/execl?【发布时间】:2012-02-2503:21:49【问题描述】:我正在尝试设置一个程序,该程序使用进程间通... 查看详情

简述linux进程间通信的几种方式

...,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。2、高级管道通信高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这... 查看详情

与命名管道和 WCF 服务的进程间通信:线程问题

】与命名管道和WCF服务的进程间通信:线程问题【英文标题】:Inter-processcommunicationwithnamedpipeandWCFService:threadingissue【发布时间】:2012-02-1721:55:14【问题描述】:我有两个进程:一个是GUI,另一个是CUI。它们每个都托管一个简单... 查看详情

实验八进程间通信

...信号量、共享内存实现进程间通信的方法。1、举例说明使用匿名管道进行进程通信匿名管道:2、举例说明使用mkfifo命令创建命名管道以及简单演示管道如何工作命名管道:3、编写两个程序使用第2题中创建的管道进行通信pipe_sen... 查看详情

实验八进程间通信(代码片段)

...、信号量、共享内存实现进程间通信的方法。1.举例说明使用匿名管道进行进程通信。管道通信匿名管道当进程使用pipe函数,就可以打开位于内核中的这个特殊“文件”。同时pipe函数会返回两个描述符,一个用于读,一个用于... 查看详情

简述linux进程间通信之命名管道fifo

  上文聊到管道(pipe),可以使有亲缘关系的进程间进行通信.  对于没有亲缘关系的进程如何通信?本文来聊一聊命名管道FIFO.一、概念  命名管道FIFO,提供一个路径名与之关联,以文件形式存储于文件系统中.  一个进程以r... 查看详情

8种进程间通信方式

...,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。#高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为... 查看详情

linux:进程间通信与信号(代码片段)

...信的手段,本质上是为了进程与进程交换数据的时候使用的常见的进程间通讯的方式:1.管道2.共享内存3.消息队列&信号量4.信号最大的进程间通信方式:网络二,管道管道的分类:匿名管道和命令管道2.1匿... 查看详情

进程间通信:命名管道

...间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道可以从命令行上创建,命令行方法是使用下面这个命令:$mkfifofilename命名管道也可以从程序里创建,相关函... 查看详情

进程间通信:管道

...管道  当从一个进程连接数据流到另一个进程时,我们使用术语管道(pipe)。我们通常是把一个进程的输出通过管道连接到另一个进程的输入。对于shell命令来说,命令的连接是通过管道字符来完成的,如:cmd1|cmd21、进程管... 查看详情

操作系统编制实现进程的管道通信的程序(代码片段)

编制实现进程的管道通信的程序使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话:Childprocess1issendingamessage! Childprocess2issendingamessage! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。... 查看详情