为了账号安全,请及时绑定邮箱和手机立即绑定

如何从子进程中的 `exec.Cmd` ExtraFiles fd 读取?

如何从子进程中的 `exec.Cmd` ExtraFiles fd 读取?

Go
DIEA 2021-09-27 18:30:41
我从golang.org阅读了解释,它如下所示。// ExtraFiles specifies additional open files to be inherited by the// new process. It does not include standard input, standard output, or// standard error. If non-nil, entry i becomes file descriptor 3+i.//// BUG: on OS X 10.6, child processes may sometimes inherit unwanted fds.// http://golang.org/issue/2603ExtraFiles []*os.File我不是很了解吗?例如我在下面有这样的代码。cmd := &exec.Cmd{    Path: init,    Args: initArgs,}cmd.Stdin = Stdincmd.Stdout = Stdoutcmd.Stderr = Stderrcmd.Dir = Rootfscmd.ExtraFiles = []*os.File{childPipe}那是说,既然我已经写了childpipe cmd.ExtraFiles = []*os.File{childPipe},我可以写的fd使用它3直接。pipe = os.NewFile(uintptr(3), "pipe")json.NewEncoder(pipe).Encode(newThing)谢谢如果有人可以提供一些帮助!
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

正确的; 您可以通过创建一个新*File的文件描述符是子管道的文件描述符来从管道中读取。下面是从子进程到父进程的管道数据示例:


家长:


package main


import (

    "fmt"

    "os/exec"

    "os"

    "encoding/json"

)


func main() {

    init := "child"

    initArgs := []string{"hello world"}


    r, w, err := os.Pipe()

    if err != nil {

        panic(err)

    }


    cmd := exec.Command(init, initArgs...)

    cmd.Stdin = os.Stdin

    cmd.Stdout = os.Stdout

    cmd.Stderr = os.Stderr

    cmd.ExtraFiles = []*os.File{w}


    if err := cmd.Start(); err != nil {

        panic(err)

    }

    var data interface{}

    decoder := json.NewDecoder(r)

    if err := decoder.Decode(&data); err != nil {

        panic(err)

    }

    fmt.Printf("Data received from child pipe: %v\n", data)

}

孩子:


package main


import (

    "os"

    "encoding/json"

    "strings"

    "fmt"

)


func main() {

    if len(os.Args) < 2 {

        os.Exit(1)

    }

    arg := strings.ToUpper(os.Args[1])


    pipe := os.NewFile(uintptr(3), "pipe")

    err := json.NewEncoder(pipe).Encode(arg)

    if err != nil {

        panic(err)

    }

    fmt.Println("This message printed to standard output, not to the pipe")

}


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信