文件open

发布于 2022-08-29 22:59:00 字数 449 浏览 11 评论 0

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 技术交流群。

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

发布评论

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

评论(1

天涯离梦残月幽梦 2022-09-05 22:59:00

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)

如果把赋值、引用计数两件事情封装起来,就比较好理解了:

void path_assign_and_get(struct path *dest, struct path *src)
{
    *dest = *src;
    path_get(src);
}

static const char *path_init(struct nameidata *nd, unsigned flags)
{
    ...
    path_assign_and_get(&nd->root, ¤t->fs->root);
    path_assign_and_get(&nd->path, &nd->root);
    ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文