我有一个通过 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:10101Accept=yes[Install]WantedBy=sockets.target相应的单元文件如下所示:[Unit]Description=My Program [Service]Type=simpleExecStart=/usr/bin/myprog -NStandardInput=socketStandardOutput=socketStandardError=journalTimeoutStopSec=5KillMode=process[Install]WantedBy=multi-user.target
1 回答

慕盖茨4494581
TA贡献1850条经验 获得超11个赞
使用连接的文件:
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()
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消