Considere una situación en la que dos procesos realizan intentos simultáneos de colocar un bloqueo exclusivo en algún archivo usando flock(fd, LOCK_EX|LOCK_NB)
.
Como se indicó, los intentos son sin bloqueo , por lo que se supone que uno de los dos procesos falla con EWOULDBLOCK
.
Aquí está mi pregunta: ¿La implementación (Linux) de flock()
garantiza que exactamente uno de los dos procesos tendrá éxito en cada caso? ¿O es posible que ambos terminen fallando con EWOULDBLOCK
incluso cuando nadie más interfiere?
En resumen, ¿puede flock(fd, LOCK_EX|LOCK_NB)
fallar falsamente con EWOULDBLOCK
?
Estoy principalmente interesado en la versión de flock()
que ofrece Linux, pero la información sobre flock()
en otros sistemas, como OS X, es muy bienvenida.
Además, supongo que la respuesta es la misma independientemente de si los bloqueos son exclusivos ( LOCK_EX
) o compartidos ( LOCK_SH
). Si no, házmelo saber.
EWOULDBLOCK El archivo está bloqueado y se seleccionó el indicador LOCK_NB.
Entonces, obtener EWOULDBLOCK significa que el archivo ya está bloqueado. Si se garantiza que sus dos procesos son los únicos involucrados, nunca obtendrán EWOULDBLOCK en el mismo archivo al mismo tiempo.
Tenga en cuenta que los hilos son una historia diferente. Los subprocesos normalmente comparten descriptores de archivo, por lo que varios subprocesos dentro del mismo proceso pueden llamar a flock() con éxito en el mismo archivo.