$
$ touch a
$ ls -i
33194567 a
$ mv a mv_a
$ ls -i
33194567 mv_a
$
结论:把一个文件mv到一个新文件,不会改变这个文件的inode;
$
$ touch a b
$ ls -i
33194567 a 33194568 b
$ mv a b
$ ls -i
33194567 b
$
结论:把一个文件mv到一个旧文件,旧文件的inode会变成被mv文件的inode;
总结上面的两条结论:mv操作,目标文件的inode将等于源文件的inode;
因此正在写入的文件被mv,数据仍然被写入到mv后的文件里。当然本文所指的写入时机是open之后的write,而不是重新open再write。
刚刚做了一下测试,正在写入的文件被rm后,数据会被写入到系统缓存中,一直会耗尽所有可用的内存,当内存不够用时,会使用虚拟内存,这个时候你就看到kswapd0进程开始逐渐消耗CPU,我没有让程序一直跑下去,不知道最终会出现个什么情况,可能会导致系统卡死等现象(只是猜测)。
最后在扩展一下,如果你自己打算实现一个日志框架,请一定要记住,在每次写入之前,一定要判断一下当前的文件句柄对应的inode是否等于对应写入文件的inode,以及写入文件是否存在,坚决做到不让外界操作影响程序原意。