面试题答案
一键面试-
基本步骤:
- 启动进程:使用
exec.Command
启动新进程。 - 创建管道:在Go语言中通过
os.Pipe
创建管道,新进程通过标准输入输出与管道连接,Go程序则可以通过管道读写数据。 - 创建channel:在Go程序中创建一个
channel
用于在不同的goroutine间传递消息。 - 数据传递:在一个goroutine中从
channel
读取数据,然后写入到新进程的标准输入管道;在另一个goroutine中从新进程的标准输出管道读取数据,然后写入到channel
中。
- 启动进程:使用
-
示例代码:
package main
import (
"bytes"
"fmt"
"io"
"log"
"os/exec"
)
func main() {
// 创建channel
ch := make(chan string)
// 启动新进程
cmd := exec.Command("cat")
var stdin bytes.Buffer
var stdout bytes.Buffer
cmd.Stdin = &stdin
cmd.Stdout = &stdout
// 启动进程
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
// 向进程写入数据
go func() {
stdin.WriteString("Hello from Go!\n")
close(ch)
}()
// 从进程读取数据
go func() {
out, err := io.ReadAll(cmd.Stdout)
if err != nil {
log.Fatal(err)
}
ch <- string(out)
}()
// 等待进程结束
err = cmd.Wait()
if err != nil {
log.Fatal(err)
}
for msg := range ch {
fmt.Println("Received:", msg)
}
}
在上述代码中:
- 首先创建了一个
channel
ch
。 - 然后使用
exec.Command
启动了一个cat
进程,cat
进程会将输入原封不动输出。 - 一个goroutine向
cat
进程的标准输入写入数据。 - 另一个goroutine从
cat
进程的标准输出读取数据并写入channel
。 - 主函数等待进程结束并从
channel
中读取数据打印。
请注意,实际应用中可能需要更复杂的错误处理和资源管理。