gpt4 book ai didi

go - 如何在子进程中读取 `exec.Cmd` ExtraFiles fd?

转载 作者:IT王子 更新时间:2023-10-29 01:55:25 35 4
gpt4 key购买 nike

我阅读了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/2603
ExtraFiles []*os.File

我不是很懂?例如,我在下面有这样的代码。

cmd := &exec.Cmd{
Path: init,
Args: initArgs,
}
cmd.Stdin = Stdin
cmd.Stdout = Stdout
cmd.Stderr = Stderr
cmd.Dir = Rootfs
cmd.ExtraFiles = []*os.File{childPipe}

那是不是意味着,既然我在cmd.ExtraFiles = []*os.File{childPipe}中写了一个childpipe,我可以通过写fd 3来使用它直接。

pipe = os.NewFile(uintptr(3), "pipe")
json.NewEncoder(pipe).Encode(newThing)

如果有人能提供一些帮助,谢谢!

最佳答案

正确;您可以通过创建一个新的 *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)
}

child :

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")
}

关于go - 如何在子进程中读取 `exec.Cmd` ExtraFiles fd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528756/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com