No. Sui sistemi POSIX-compatibili, tutti i blocchi sono comunque di consulenza, quindi anche se apache otterrebbe un blocco di lettura, l'altro processo potrebbe semplicemente scrivere il file.
È possibile determinare che con strace
:
[pid 7246] open("/var/www/file.json", O_RDONLY|O_CLOEXEC) = 11
[pid 7246] fcntl(11, F_GETFD) = 0x1 (flags FD_CLOEXEC)
[pid 7246] mmap(NULL, 20, PROT_READ, MAP_SHARED, 11, 0) = 0x7f53f93da000
[pid 7246] munmap(0x7f53f93da000, 20) = 0
[pid 7246] writev(10, [{"HTTP/1.1 200 OK\r\nDate: Thu, 26 J"}, ...) = 365
[pid 7246] close(11) = 0
Pertanto, può accadere che il file JSON è solo parzialmente scritto. Per evitare questo problema, scrivere il file JSON in un file temporaneo sullo stesso file system e utilizzare l'atomico rename
per sovrascrivere il file.
In questo modo, se lo open
è riuscito, Apache continuerà a servire il vecchio file. Se lo rename
termina prima dello open
, apache otterrà il nuovo file completato.
Se si è preoccupati della coerenza (in caso di interruzione di corrente o così), è possibile anche chiamare fsync
nell'applicazione che scrive il file JSON prima di chiuderlo.
Hai davvero bisogno di un file 'fisico' o puoi semplicemente falsificare il file semplicemente emettendo il contenuto? – PeeHaa