C-最近程序没有关闭套接字fd,导致内存泄露。想问问套接字(句柄)到底占了哪些资源?

发布于 2017-04-04 04:10:30 字数 9 浏览 1416 评论 1

如题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2017-08-14 16:43:42

可以先谈谈为啥要有句柄以及句柄到底是个什么玩意儿。

比如设计一个库负责管理文件,提供如下接口及使用方式:

struct file fp = createfile("/path/to/file");

writefile(fp, "hello worldn", 12);
writefile(fp, "hello worldn", 13);

closefile(fp);

file这个对象至少保存了文件在磁盘上的位置以及文件的读写位置。
通过fp这个指针你可以操作这个文件。

这时候如果你没有closefile,你知道至少file这一个对象占用的内存是不会释放的。
而实际情况是,文件系统非常复杂,需要维护的信息很多,file内部可能内嵌或关联了各种其他对象。这些对象的内存都需要释放。

那么在操作系统(内核)的世界,句柄就是fp,就是一个对象指针。你没有关闭句柄就等于没有释放一个对象指针。没有释放指针的后果可以想象。

为什么不直接用指针?为了安全,让内核直接返回给我们一个对象地址,让我们直接访问随意“践踏”?怎么可能。要是那样的话,内核将天天流血不止。

句柄就是一个数字,是到对象地址的索引,根据fd查表得到对应的对象指针(地址),然后该干嘛干嘛。

下面就是read这个系统调用的内核代码:一上来就把句柄转换为了内部对象file(378行)。

372 SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
373 {
374 struct file *file;
375 ssize_t ret = -EBADF;
376 int fput_needed;
377
378 file = fget_light(fd, &fput_needed);
379 if (file) {
380 loff_t pos = file_pos_read(file);
381 ret = vfs_read(file, buf, count, &pos);
382 file_pos_write(file, pos);
383 fput_light(file, fput_needed);
384 }
385
386 return ret;
387 }
388
"fs/read_write.c" line 351 of 912 --38%-- col 3-12

句柄这个名称很形象,你可以想象给钟表上发条,拧那个把手,带动内部结构转动的感觉。

好了,你没有关闭句柄,就是没有释放其关联的一系列对象和资源,这些对象和资源就是用来管理维护句柄指向的实体的,比如一个文件,一个socket。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文