我的意思是,如果我core.<pid>
在文件系统中看到这是否意味着核心文件生成已完成并且我可以自己使用它?
我的问题得到了解答。但我决定稍微解释一下。
我认为它首先core.<pid>
在一些隐藏文件中生成,.code.<pid>~
并且只有在生成完成后才移动(重命名)到目标路径。在这种情况下,操作可以是快速且原子的。
答案1
我不会打赌,特别是在繁忙的多线程系统上,或者如果转储位置位于网络共享上(值得注意的是,教授会生成 8 GB 核心文件,这些文件必须通过 NFS 通过 10Mbit 以太网进行假脱机)。文件系统原子性通常需要锁定或写入临时文件然后再写入的rename(1)
技巧。有些钻研fs/coredump.c
对于 linux 4.3.3 内核,表明没有这样的锁定或重命名技巧,因为内核计算出要使用的文件名(带有取消链接竞争条件!),然后假脱机输出文件:
file_start_write(cprm.file);
core_dumped = binfmt->core_dump(&cprm);
file_end_write(cprm.file);
由于可能没有巨大的内核锁来阻止其他用户态事物在上面执行其业务时运行(这可以通过减慢大型核心文件的生成进行测试,然后查看该系统的行为方式),我不认为在这个过程中看不到任何原子性的东西。
答案2
不,像任何其他文件一样,它在写入开始时出现在文件系统中,而不是在完成和关闭时出现。