猿问

如何在golang中执行套接字激活,将套接字作为标准输入/输出传递给子进程?

我有一个通过 systemd 套接字激活运行的 C 程序。Systemd 侦听端口,当 TCP 连接进入时,应用程序将启动,并将 stdin/stdout完全视为套接字(IE:setsockopt 等)。

我试图用一个小的启动程序来模仿这种行为。它只会被告知要侦听的端口以及与它建立连接时要运行的命令(没有其他高级 systemd 功能)。

我遇到的问题是我似乎无法将连接作为套接字传递给标准输入/输出。将 TCPConn 传递给Stdinand StdoutofCmd不起作用(C 程序在 setsockopts 上出错)。

      cmd := exec.Cmd{
                Path:   cmds,
                Args:   args,
                Stdin:  conn.,
                Stdout: conn,
                Stderr: os.Stderr,
            }
            err = cmd.Run()

我看到一篇dup(2)关于如何在 C 中使用和 fork做这样的事情的文章,但是

  • 它正在分叉而不是执行另一个子进程

  • 我不完全理解套接字 fd 被复制而不是client接受的连接

有没有办法在 Golang 中做这样的事情?

套接字文件看起来大致像


[Unit]

Description=soc activated program 


[Socket]

ListenStream=0.0.0.0:10101

Accept=yes


[Install]

WantedBy=sockets.target

相应的单元文件如下所示:


[Unit]

Description=My Program 


[Service]

Type=simple

ExecStart=/usr/bin/myprog -N

StandardInput=socket

StandardOutput=socket

StandardError=journal

TimeoutStopSec=5

KillMode=process


[Install]

WantedBy=multi-user.target


翻阅古今
浏览 114回答 1
1回答

慕盖茨4494581

使用连接的文件:  f, err := conn.File()        if err != nil { /* TODO handle error */}        defer f.Close()        cmd := exec.Cmd{            Path:   cmds,            Args:   args,            Stdin:  f,            Stdout: f,            Stderr: os.Stderr,        }        err = cmd.Run()
随时随地看视频慕课网APP

相关分类

Go
我要回答