MST

星途 面试题库

面试题:Go中如何使用channel实现简单的进程间通信

请描述在Go语言中,利用channel进行两个进程(假设通过`exec.Command`启动新进程)间简单消息传递的基本步骤,并给出一个简单示例代码。
28.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤

    • 启动进程:使用exec.Command启动新进程。
    • 创建管道:在Go语言中通过os.Pipe创建管道,新进程通过标准输入输出与管道连接,Go程序则可以通过管道读写数据。
    • 创建channel:在Go程序中创建一个channel用于在不同的goroutine间传递消息。
    • 数据传递:在一个goroutine中从channel读取数据,然后写入到新进程的标准输入管道;在另一个goroutine中从新进程的标准输出管道读取数据,然后写入到channel中。
  2. 示例代码

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中读取数据打印。

请注意,实际应用中可能需要更复杂的错误处理和资源管理。