V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  timewarp  ›  全部回复第 5 页 / 共 6 页
回复总数  110
1  2  3  4  5  6  
2023-12-27 15:53:56 +08:00
回复了 zhonghao01 创建的主题 分享发现 无意中在彩云天气 APP 中点出了似乎是开发者的设置页面
有没有知乎的,我想关掉广告
2023-12-25 19:07:17 +08:00
回复了 easyalarm 创建的主题 音乐 在你的印象中哪首圣诞歌最能让你感觉有圣诞氛围?
jingle bell. not jing bell
2023-12-25 11:31:19 +08:00
回复了 YGBlvcAK 创建的主题 健康 强烈安利一款口腔溃疡凝胶, 10 年+经验
康复新液(蟑螂汁)也很好用
2023-12-19 17:21:12 +08:00
回复了 x2x 创建的主题 程序员 请教下服务器安全的相关问题
在 qemu 里跑
这是哆啦 A 梦的口袋
2023-12-18 18:00:11 +08:00
回复了 Allenxup 创建的主题 职场话题 一个深圳打工人的求职之路
空窗期真是个蛋疼的事情
2023-12-13 16:45:00 +08:00
回复了 rainy000 创建的主题 远程工作 远程工作哪个方向容易找?
@orange 进局子
《编译器设计》
防君子不防小人,拿其他手机拍一个
2023-11-08 16:07:08 +08:00
回复了 token10086 创建的主题 程序员 求求你们都别卷工具站了
这站点怎么盈利,打广告吗...
2023-11-07 16:24:30 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
@julyclyde 你真的是.....那我来给你讲讲代码吧...

首先,你讲的/proc/pid/mounts 是 pid 这个进程所在的命名空间里挂载的所有文件系统列表,跟题主的问题没有任何关系,题主没有涉及 namespace 的切换,主进程和 sdk (子进程之类的)处于同一个 namespace 。

其次,让我们看一下 vfs 层的代码,

path_lookupat 函数负责解析路径分量,path_init 负责初始化路径分量的解析起点,对于 ls . 这个命令来讲,我们把起点设定为 fs->pwd ,也就是/proc/pid/cwd 的值。放在题主的环境里起点就是 workdir 这个父目录
然后函数进入 link_path_walk 开始正式解析路径分量,由于我们的入参 name=".",所以此函数一个循环直接结束,不会进一步进入 walk_component 函数了。link_path_walk 返回 0 ,此时入参 nd 直接把父目录 workdir 带回了。上层函数 path_lookupat 直接调用 lookup_last 把父目录相关的 dentry 和 inode 准备好,然后层层返回,路径查找结束。

那么再来看看 ls /tmp/workdir 的情况,路径分量解析起点是/,即父文件系统的根目录。然后 name="/tmp/workdir"被 link_path_walk 逐段解析,由于/后是 tmp 字符串,所以调用 walk_component 首先解析 tmp ,这个环节无事发生,再然后使用 walk_component 继续进入 workdir 这个子目录,此时发现 workdir 的 dentry 上有个标志位 DCACHE_MOUNTED(mount 系统调用是给 workdir 这个挂载点设置的,参见函数 d_set_mounted),这说明了什么?说明这是个挂载点,于是 lookup_mnt 被调用,路径查找流程开始“下降”到子文件系统,所以我们要解析的下一个分量不再是父文件系统的 workdir 目录,而是子文件系统的根目录。于是我们就看到了新的内容。


对比以上两个过程,我们会发现当 ls . 的时候,由于. 是个特殊的分量,内核会特殊的处理,所以不会走 walk_component ,也就没机会检测到当前目录上的 DCACHE_MOUNTED 标志。
而我们 ls 一个/tmp/workdir 的时候,迫使内核重新走一遍路径分量解析,它就能发现 DCACHE_MOUNTED 标志。

这就是为什么 ls . 永远看到旧内容,而 ls ../workdir 或者 ls /tmp/workdir 却可以看到新内容
2023-11-07 13:08:27 +08:00
回复了 WilliamColton 创建的主题 C 各位有什么深入了解 C 语言的书嘛?
当然是《 redis 设计与实现》
2023-11-07 13:05:14 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
@julyclyde `ls . `这个命令不会做路径查找,而是直接获取进程 cwd ,所以看到的是老内容,但是 ls /tmp/workdir 需要解析路径,在 open 系统调用时会做 walk path ,路径分量解析到 workdir 这一层发现 dentry 设置了挂载标志,表示这是个挂载点,于是路径查找下降到子文件系统,就看到了新内容。
2023-11-07 13:00:50 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
为今之计建议再建立一层目录,形成/tmp/common/workdir 的结构,主进程和 sdk 都切换到 common 这一层,然后主进程在 workdir 挂载文件系统,sdk 每次读取时去子目录 workdir 下找文件。这样不管 workdir 怎么被遮盖,sdk 每次都要做目录查找,看到的一定是最新的
2023-11-07 12:56:44 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
@rev1si0n 你一定要在目录上挂载一个文件系统吗
2023-11-07 12:56:13 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
@julyclyde 有效的,只要重新做路径查找就能看到新的
2023-11-07 11:31:41 +08:00
回复了 rev1si0n 创建的主题 Linux tmpfs 挂载后之前占用目录的进程无法发现刚 mount 目录中的文件
@rev1si0n 所以你的需求是 sdk 看到的是旧内容,但是主进程看到的是新内容,你也想让 sdk 现在看到主进程看到的新内容吗
1  2  3  4  5  6  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5943 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 44ms · UTC 01:45 · PVG 09:45 · LAX 18:45 · JFK 21:45
♥ Do have faith in what you're doing.