使用 systemd <service>.socket 时,哪个文件描述符接收套接字?

When using a systemd <service>.socket, which file descriptor receives the socket(s)?

当我创建 <service>.socket systemd 文件时,我可以包含以下条目:

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

等等

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

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


请注意,我假设我的 <service>.socket 将使用:

Accept=no

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

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

sd_listen_fds() may be invoked by a daemon to check for file descriptors passed by the service manager as part of the socket-based activation logic. It returns the number of received file descriptors. If no file descriptors have been received, zero is returned. The first file descriptor may be found at file descriptor number 3 (i.e. SD_LISTEN_FDS_START), the remaining descriptors follow at 4, 5, 6, …, if any.