关闭 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
.
我正在使用从 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
asclose(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
.