为什么生产者需要锁定目录才能在 Linux 中创建新文件?
Why does producer need to lock directory to create new files in Linux?
有一个生产者会将新文件下载到本地文件系统(它永远不会修改现有文件),还有一个消费者会定期检查是否有新文件并读取新文件。
我有点困惑为什么生产者需要在创建新文件之前锁定目录,而消费者在读取新文件时锁定目录,因为现有文件永远不会被修改,所以reader 正在阅读时作者编辑文件应该不是问题。
谢谢
生成文件不是原子的。首先,创建一个空文件。然后它的内容被写入它,可能是多次写入。每次写入都会修改文件,因此您声称文件从未被修改是错误的。
正在使用锁来确保消费者只获取完整的文件。[1]
可以使用其他锁定方法。例如,生产者可以创建后缀为 .tmp
的文件,然后在文件完成后将文件重命名(而不是复制)为正确的名称。如果消费者忽略以 .tmp
结尾的文件,那么它只会选择完整的文件。[2]
从生产者再也不会添加的意义上来说是完整的。但这并不意味着该文件包含它应该包含的所有内容。如果生产者崩溃,并且自动释放锁,消费者可能只收到部分预期内容。
真完整。生产者不仅不会再向其中添加内容,而且生产者打算写入文件的所有内容都已写入其中。 (恰好在错误的时刻发生断电或发生类似的剧烈事件。)
有一个生产者会将新文件下载到本地文件系统(它永远不会修改现有文件),还有一个消费者会定期检查是否有新文件并读取新文件。
我有点困惑为什么生产者需要在创建新文件之前锁定目录,而消费者在读取新文件时锁定目录,因为现有文件永远不会被修改,所以reader 正在阅读时作者编辑文件应该不是问题。
谢谢
生成文件不是原子的。首先,创建一个空文件。然后它的内容被写入它,可能是多次写入。每次写入都会修改文件,因此您声称文件从未被修改是错误的。
正在使用锁来确保消费者只获取完整的文件。[1]
可以使用其他锁定方法。例如,生产者可以创建后缀为 .tmp
的文件,然后在文件完成后将文件重命名(而不是复制)为正确的名称。如果消费者忽略以 .tmp
结尾的文件,那么它只会选择完整的文件。[2]
从生产者再也不会添加的意义上来说是完整的。但这并不意味着该文件包含它应该包含的所有内容。如果生产者崩溃,并且自动释放锁,消费者可能只收到部分预期内容。
真完整。生产者不仅不会再向其中添加内容,而且生产者打算写入文件的所有内容都已写入其中。 (恰好在错误的时刻发生断电或发生类似的剧烈事件。)