问题描述
#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复制和粘贴代码。我只想确保此代码不会引起内存泄漏。
解决方法
我还应该像最后
var.function_name
一样关闭连接con
吗?
否,因为那不是“连接”。看看man 2 connect
:
返回值
如果连接或绑定成功,则返回零。如果出错,则返回-1,并正确设置
close(con);
。
您的errno
等于con
的返回值,因此它是connect
表示成功或0
表示错误。它不是文件描述符,因此您不应尝试将其关闭。
我建议您重命名变量(例如,重命名为-1
)或只检查res
条件的内部:
if
我只想确保此代码没有内存泄漏。
无论如何您都不会。当程序完成运行时,操作系统将自动关闭所有文件描述符。如果您打开文件描述符(如if (connect(sock,(struct sockaddr *) &server,sizeof(struct sockaddr_un)) == -1) {
close(sock);
perror("connecting stream socket");
exit(1);
}
)并一直使用到程序结束,则甚至不必sock
(尽管这是一个好习惯)。通常,正常程序永远不会关闭标准输入,标准输出和标准错误文件描述符。
% IANA WHOIS server
% for more information on IANA,visit http://www.iana.org
% This query returned 1 object
domain: ଭାରତ
domain-ace: XN--3HCRJ9C
返回0(成功)或-1(错误),而不是连接。关闭0将关闭程序的connect()
。关闭-1是一个错误,不会再有其他后果。无论哪种情况,您都不关闭stdin
。