【问题标题】:When using a systemd <service>.socket, which file descriptor receives the socket(s)?使用 systemd <service>.socket 时,哪个文件描述符接收套接字?
【发布时间】:2021-10-21 16:55:07
【问题描述】:

当我创建&lt;service&gt;.socket systemd 文件时,我可以包含以下条目:

ListenDatagram=/run/<service>/listen.sock
ListenFIFO=/run/<service>/IPC.FIFO

等等

systemd.socket documentation 表示这些套接字作为文件描述符传递给我的应用程序。我没有看到的是:这些是哪些文件描述符?那会是3、4、5……等等吗?还是替换 0(输入)和 1(输出)?

换句话说,在我的软件中,我怎么知道什么是什么?


请注意,我假设我的 &lt;service&gt;.socket 将使用:

Accept=no

因为Accept=yes 明确表示它像inetd 一样工作,这意味着stdinstdout 按预期接收输入和输出套接字(对于TCP 流,这将是相同的套接字重复)。

【问题讨论】:

    标签: c++ c sockets systemd


    【解决方案1】:

    应该是 3、4、5、6 ...

    sd_listen_fds() 可以由守护进程调用以检查文件 由服务管理器作为基于套接字的一部分传递的描述符 激活逻辑。它返回接收到的文件描述符的数量。 如果没有接收到文件描述符,则返回零。首先 文件描述符可以在文件描述符编号 3 处找到(即 SD_LISTEN_FDS_START),其余的描述符在 4, 5, 6, …, 如果有的话。

    【讨论】:

    • 哦!它使用环境变量。凉爽的。这看起来也是一个简洁的功能。您可以启动/停止您的服务并仍然接收连接,而不会占用大量内存。这对于每天只使用一次左右的后台服务很有用。
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2011-03-31
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多