文件open
static int path_init(int dfd, const char *name, unsigned int flags, struct nameidata *nd)
{
......
if (*name=='/')
{
set_root(nd);
nd->path = nd->root;
path_get(&nd->root);
}
else if(dfd == AT_FDCWD)
..........
}
在if (*name=='/')分支,调用了set_root,set_root里面有调用path_get(&nd->root),set_root执行完后,又调用了一次path_get(&nd->root),调用两次是什么情况?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
path_get
是用于增加引用计数的。在
set_root
里面,*root = fs->root
给当前进程的fs->root
增加了一次引用,所以需要path_get(root)
,这句实际上应该是path_get(&fs->root)
,两种写法是等价的,只是前面的写法似乎可以减少一次寻址的开销。在
set_root
之后,nd->path = nd->root
给这个nd->root
增加了一次引用,所以需要path_get(&nd->root)
。如果把赋值、引用计数两件事情封装起来,就比较好理解了: