我有一個通過 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 關注
- 105 瀏覽
添加回答
舉報
0/150
提交
取消