如题
可以先谈谈为啥要有句柄以及句柄到底是个什么玩意儿。
比如设计一个库负责管理文件,提供如下接口及使用方式:
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;377378 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 }385386 return ret;387 }388"fs/read_write.c" line 351 of 912 --38%-- col 3-12
句柄这个名称很形象,你可以想象给钟表上发条,拧那个把手,带动内部结构转动的感觉。
好了,你没有关闭句柄,就是没有释放其关联的一系列对象和资源,这些对象和资源就是用来管理维护句柄指向的实体的,比如一个文件,一个socket。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(1)
可以先谈谈为啥要有句柄以及句柄到底是个什么玩意儿。
比如设计一个库负责管理文件,提供如下接口及使用方式:
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。