关闭 unix 套接字的正确方法

Proper way of closing a unix socket

我正在使用从 this link:

获得的代码
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define DATA "Hello world"


int main()
{
  int sock;
  struct sockaddr_un server;

  sock = socket(AF_UNIX, SOCK_STREAM, 0);
  if (sock < 0) {
      perror("opening stream socket");
      exit(1);
  }

  server.sun_family = AF_UNIX;
  strcpy(server.sun_path, "/tmp/foo.sock");

  int con = connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un));
  if (con < 0) {
      close(sock);
      perror("connecting stream socket");
      exit(1);
  }

  const char * D = "Hello world!";
  if (write(sock, DATA, sizeof(DATA)) < 0)
      perror("writing on stream socket");

  close(sock);

  // QUESTION
  // close(con);   // should I include this line?

  return 0;
}

只要有服务器侦听数据,此代码就有效。

无论如何我的问题是我是否也应该关闭连接con作为最后的close(con);

如果事实证明您确实必须关闭连接,那么这证明您不应该从 Internet 复制和粘贴代码。我只是想确保这段代码没有内存泄漏。

should I also close the connection con as close(con); at the end?

不,因为那不是“联系”。看看 man 2 connect:

RETURN VALUE

If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.

您的 con 只是 connect 的 return 值,因此它要么是 0 表示成功,要么是 -1 表示错误。它不是文件描述符,因此您不应尝试关闭它。

我建议您重命名变量(例如 res)或只检查 if 条件:

if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) == -1) {
    close(sock);
    perror("connecting stream socket");
    exit(1);
}

I just want to make sure I have no memory leaks with this code.

无论如何你都不会。当您的程序完成时,操作系统会自动关闭所有文件描述符 运行。如果你打开一个文件描述符(比如你的sock)并一直使用它直到程序结束,甚至没有必要close()它(尽管这是一个好习惯)。标准输入、标准输出和标准错误文件描述符通常不会被正常程序关闭。

connect() returns 0(成功)或 -1(错误),不是连接。关闭 0 将关闭程序的 stdin。关闭 -1 是一个不会产生进一步后果的错误。无论哪种情况,您都应该 而不是 关闭 con.