我正在尝试让两个 golang 程序使用管道进行通信,每个程序同时运行,例如:
1 go run master/main/main.go
2 master/main/main.go calls slave.exe (built go program)
3 slave.exe prints out "Ping"
4 master/main/main.go reads "Ping" and writes "Pong"
5 slave.exe reads "Pong" and prints out "Message recieved: Pong"
程序到达第 4 步,但没有收到来自 slave.exe 的另一条消息。
在 master/main/main.go 中:
package main
import (
"fmt"
"os"
"os/exec"
"bufio"
)
func main() {
// Run compiled slave project:
c := exec.Command("main", insert_path_to_exe_here)
out, _ := c.StdoutPipe()
in, _ := c.StdinPipe()
c.Start() // Using Start() instead of Run() because Run() waits for program to finish before moving on.
inwriter := bufio.NewWriter(in)
outreader := bufio.NewReader(out)
// This should print "Ping".
fmt.Println(outreader.ReadString('\n'))
inwriter.WriteString("Pong")
// This should print "Message received: Pong"
fmt.Println(outreader.ReadString('\n'))
}
在 slave/main/main.go 中:
package main
import (
"fmt"
"bufio"
"os"
)
func main() {
fmt.Println("Ping")
reader := bufio.NewReader(os.Stdin)
s, _ := reader.ReadString('\n')
fmt.Println("Message received: ", s)
}
运行:
- 构建slave/main/main.go
- 将 insert_path_to_exe_here 替换为构建的可执行文件的路径,并将“main”替换为可执行文件的名称。
- 运行 master/main/main.go
最佳答案
您的子进程正在使用 ReadString('\n')
,但您没有编写 \n
字符,也没有刷新缓冲的编写器。
这会将预期的数据写入管道:
inwriter.WriteString("Pong\n")
inwriter.Flush()
关于go - Golang 中多个程序之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50723053/