【问题标题】:systemd socket activation, sd_listen_fds return 0 fdsystemd 套接字激活,sd_listen_fds 返回 0 fd
【发布时间】:2021-09-19 00:58:50
【问题描述】:

我正在编写一个示例 systemd 服务来测试一些东西。 不幸的是,测试代码不起作用。 (我希望它很简单..)

$>cat test.socket

[Unit] 
Description=TEST-SERVICE
[Socket] 
ListenStream=5575 
Accept=yes
[Install] 
WantedBy=sockets.target

$>cat test@.service

[Unit] 
Description=TEST-SERVICE
Requires=test.socket

[Service] 
StandardInput=socket 
PIDFile=/var/run/test.pid 
ExecStart=/usr/bin/server_d     
Type=simple
[Install]
WantedBy=default.target

服务器代码如下所示

int main(int argc, char *argv[]){
    char buffer[255];       //Temporary buffer to read and write data
    int sockfd, newsockfd ; //File descriptor for Sockets
    struct sockaddr_in cli_addr;    //Structure to hold Client details
    socklen_t cli_len;      //Client length

    int nfd = sd_listen_fds(0);
    if (nfd != 1) {
            fprintf(stderr, "No or too many file descriptors received.\n");
            fprintf(stderr, "FD Count: %d.\n",nfd);
            exit(1);
    }

    sockfd = SD_LISTEN_FDS_START + 0;

当我连接到服务时,输出如下。

>telnet 15.218.114.55 5575 
Trying 15.218.114.55... 
Connected to 15.218.114.55. 
Escape character is '^]'. 
No or too many file descriptors received. 
FD Count: 0. 
Connection closed by foreign host.

在我看来 sd_listen_fds(0) 返回 0。 这里可能是什么原因?

提前感谢您的帮助。

【问题讨论】:

    标签: c sockets systemd


    【解决方案1】:

    插座单元有两种不同的工作方式。使用Accept=yes,systemd 将为每个LISTEN...=... 套接字执行bind()listen() 调用,然后在它们上等待select()。每当有连接时,一个套接字就准备好了,systemd 将对套接字连接进行accept() 调用,然后将新的套接字 fd 传递给准备使用读/写等的服务单元。然后 Systemd 继续等待新的连接,并且会以类似的方式与它们中的每一个启动一个新的服务。

    在这种情况下,(模板)服务使用sd_listen_fds()。如果你有StandardInput=socket,那么你可以简单地读/写fd 0。

    第二种类型的套接字单元有Accept=no(如果没有指定则默认)。 Systemd 将为每个LISTEN...=... 套接字执行bind()listen() 调用,然后在它们上等待select()。一旦第一个套接字准备好,它将只启动一次服务并将所有打开的套接字文件描述符传递给它。这就是sd_listen_fds() api 的用武之地。它表示传递了多少个套接字文件描述符。它们从 3 开始 (SD_LISTEN_FDS_START)。

    服务应用程序现在必须找出哪些已传递的套接字已准备就绪。通常情况下,socket 单元中只有一个LISTEN 行,所以只传递了一个fd,所以很容易(否则只需执行select())。

    服务应用程序现在必须在就绪套接字上执行accept(),然后才能读取/写入新的 fd。正常情况下,它还会继续等待它所提供的已侦听套接字上的更多连接,做更多的接受,等等。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多