Questa è una risposta molto tardiva, ma... sì rename()
è atomico ma non nel senso della tua domanda. Sotto Linux, rename(2)
dice:
Tuttavia, durante la sovrascrittura ci sarà probabilmente una finestra in cui sia oldpath che newpath si riferiscono al file che viene rinominato.
Ma rename()
è ancora atomico in un senso molto importante:se lo usi per sovrascrivere un file, ti ritroverai con la vecchia o la nuova versione e nient'altro.
[aggiornamento: ma come sottolinea @jonas-wielicki nei commenti, devi assicurarti che il file che stai rinominando abbia contenuti aggiornati, usando fsync()
e amici.]
Se newpath esiste già, verrà sostituito atomicamente (soggetto ad alcune condizioni; vedi ERRORI di seguito), in modo che non ci sia un punto in cui un altro processo che tenta di accedere a newpath lo trovi mancante.
Se vedi ERRORS, scoprirai che la ridenominazione potrebbe fallire, ma non interromperà mai l'atomicità.
Questo è tutto dalla pagina man di Linux. Quello che non so è se fai un rename()
su un file system di rete in cui il server esegue un sistema operativo diverso. Il cliente ha allora una speranza infernale di garantire l'atomicità? Ne dubito.
Sì e no.
rename() è atomico assumendo che il sistema operativo non si arresti in modo anomalo. Non può essere diviso da nessun altro filesystem operativo.
Se il sistema va in crash, potresti invece vedere un'operazione ln().
Si noti inoltre che, quando si opera su un filesystem di rete, è possibile ottenere ENOENT quando l'operazione ha esito positivo. Il filesystem locale non può farti questo.
Non sono sicuro che la parte "fondamentalmente" della tua domanda sia valida. A meno che tu non abbia una sorta di sincronizzazione tra i due, non importa quanto sia la ridenominazione atomica. Se la copia della directory arriva prima della ridenominazione, avrai file1 in entrambi i posti.
Non sono sicuro se intendi thread o processi, ma se ci sono meccanismi di blocco per entrambi, i blocchi di threading sono di gran lunga i più semplici perché non devono attraversare i limiti del processo.