08/07/25 13:35:09 VHMpv0v7
二つのプロセスが、早い者勝ちであるファイルを作っている。
二つのgccが早い者勝ちで同じ a.out を作っている、とかね。
この場合なんだけど、
このファイル更新処理をアトミックでやる最善の方法は?
何が言いたいかというと、プロセスAがもう出力を始めたのに、
プロセスBがそれを上書きするような事態は避けたい。
たとえば、同じパスにa.out.$pid とかを作って、
それを rename(2) する、という方法だと、
別プロセスの方が先にファイルを作っていても、それを上書きしちゃう。
いまは、ファイル出力前に、a.out を touch して、
その有無をある種のLock Fileの様につかい、
あとは普通に a.out.$pid から rename してるんだけど、
これだと、
touch した直後にプロセスがコケるとデッドロックしちゃうし、
なにより、二つに処理を分けるのがカッコわるい。
一撃でアトミックにやる方法は?