登录
首页 >  Golang >  Go问答

在 golang 中如何实现通过套接字传递 stdin/out 给子进程?

来源:stackoverflow

时间:2024-02-17 21:42:25 244浏览 收藏

大家好,我们又见面了啊~本文《在 golang 中如何实现通过套接字传递 stdin/out 给子进程?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我有一个通过 systemd 套接字激活运行的 c 程序。 systemd 侦听端口,当 tcp 连接进入时,应用程序就会启动,并且它对待 stdin/stdout 完全像套接字(即:setsockopt 等)。

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

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

            cmd := exec.cmd{
                path:   cmds,
                args:   args,
                stdin:  conn.,
                stdout: conn,
                stderr: os.stderr,
            }
            err = cmd.run()

我看到一篇关于如何使用 dup(2) 和 fork 在 c 中执行类似操作的文章,但是

  • 它是分叉而不是执行另一个子进程
  • 我不完全理解套接字 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

正确答案


使用连接的 file

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()

好了,本文到此结束,带大家了解了《在 golang 中如何实现通过套接字传递 stdin/out 给子进程?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>