【发布时间】:2011-11-25 13:48:09
【问题描述】:
如果以下多个(示例)程序同时运行,需要采取哪些步骤来确保始终正确地将“完整”行附加到文件末尾。
#!/usr/bin/env python
import random
passwd_text=open("passwd.txt","a+")
u=("jsmith:x:1001:1000:Joe Smith,Room 1007,(234)555-8917,(234)555-0077,jsmith@rosettacode.org:/home/jsmith:/bin/sh",
"jdoe:x:1002:1000:Jane Doe,Room 1004,(234)555-8914,(234)555-0044,jdoe@rosettacode.org:/home/jdoe:/bin/sh",
"xyz:x:1003:1000:X Yz,Room 1003,(234)555-8913,(234)555-0033,xyz@rosettacode.org:/home/xyz:/bin/sh")
for i in range(random.randint(1,2)):
print >> passwd_text, random.choice(u)
passwd_text.close()
并且:即使磁盘已满或已设置“ulimit -f”,能否保证“全部或全部”附加(在 linux/unix 上)?
(注意类似问题:How do you append to a file?)
【问题讨论】:
-
我不知道如果磁盘已满,您如何追加数据...您可以在溢出的玻璃杯中添加更多的水吗?除此之外,使用文件锁。
flock()是一个很好的起点。 -
@Marc B - re: "disk full" @... 好点,我看到 "write" 系统调用 "返回已写入的字节数。如果值为负数,则系统调用返回错误。”。我希望“umlimit -f”对“write”有同样的效果。因此,原子追加,可能 ½ 追加,但不能保证完整追加。 (我也不记得有任何 ioctl 保证“全部或全部”写入文件,即使“记录”很小)
-
写入不是原子的吗?您的行可能与其他进程写入的其他行交错,但行本身应该是完整的,只要您最终使用单个
write系统调用(os.write应该保证,即使其他类型的写入可能是缓冲的)。如果您必须编写需要保持在一起的几行,请先将它们构建成一个字符串。 -
re:“写入不是原子的吗?” ...参照Linux NFS 概述、FAQ 和 HOWTO 文档 => nfs.sourceforge.net/#faq_a9 ...它似乎取决于操作系统和文件系统。 ¢ 这就是甲骨文支付如此丰厚股息的原因! :-) ¢