亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號