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

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

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

Go
翻阅古今 2022-10-10 19:48:23
我有一个通过 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()


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号