如果以下(示例)程序正在運行多個程序,需要採取哪些步驟來確保「全部」行總是總是正確附加到文件末尾同時。追加到併發環境中的文件末尾
#!/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,[email protected]:/home/jsmith:/bin/sh",
"jdoe:x:1002:1000:Jane Doe,Room 1004,(234)555-8914,(234)555-0044,[email protected]:/home/jdoe:/bin/sh",
"xyz:x:1003:1000:X Yz,Room 1003,(234)555-8913,(234)555-0033,[email protected]:/home/xyz:/bin/sh")
for i in range(random.randint(1,2)):
print >> passwd_text, random.choice(u)
passwd_text.close()
而且:可以「全有或全無」追加保證(在Linux/UNIX),即使磁盤已滿,或「的ulimit -f」已定?
(注意類似的問題:How do you append to a file?)
我不知道如果磁盤已滿,您可以如何追加數據......您可以添加更多的水到滿溢的玻璃杯嗎?除此之外,使用文件鎖定。 'flock()'是一個開始的好地方。 –
@Marc B - re:「disk full」@ ...好的一點,我看到「寫入」系統調用「返回寫入的字節數,如果值爲負值,那麼系統調用返回錯誤。 。我期望「umlimit -f」在「寫入」時具有相同的效果。所以一個原子追加,可能½追加,但完全追加不能保證。 (我也不記得任何保證「全部或全部」寫在文件上的ioctl,即使「記錄」很小) – NevilleDNZ
不是原子寫入嗎?你的行可能會與其他進程寫入的其他行交錯,但是行本身應該是完整的,只要你最終使用了一個'write'系統調用(這個'os.write'應該保證,即使其他類型的寫入可能會被緩衝)。如果您必須編寫多行需要保持在一起的行,請先將它們構建爲單個字符串。 –