我有一个通过 systemd 套接字激活运行的 C 程序。Systemd 侦听端口,当 TCP 连接进入时,应用程序将启动,并将 stdin/stdout完全视为套接字(IE:setsockopt 等)。
我试图用一个小的启动程序来模仿这种行为。它只会被告知要侦听的端口以及与它建立连接时要运行的命令(没有其他高级 systemd 功能)。
我遇到的问题是我似乎无法将连接作为套接字传递给标准输入/输出。将 TCPConn 传递给Stdin
and Stdout
ofCmd
不起作用(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: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
慕盖茨4494581
相关分类