Windows por defecto es el bloqueo automático y obligatorio de archivos. UNIX establece de forma predeterminada el bloqueo manual y cooperativo de archivos. En ambos casos, los valores predeterminados pueden ser anulados, pero en ambos casos generalmente no lo son.
Una gran cantidad de código antiguo de Windows utiliza la API C / C ++ (funciones similares fopen
) en lugar de la API nativa (funciones similares CreateFile
). La API de C / C ++ no le da forma de especificar cómo funcionará el bloqueo obligatorio, por lo que obtiene los valores predeterminados. El "modo compartido" predeterminado tiende a prohibir operaciones "en conflicto". Si abre un archivo para escribir, se supone que las escrituras entran en conflicto, incluso si nunca escribe realmente en el archivo. Lo mismo ocurre con los cambios de nombre.
Y, aquí es donde empeora. Además de abrir para lectura o escritura, la API de C / C ++ no proporciona ninguna forma de especificar qué piensa hacer con el archivo. Por lo tanto, la API debe asumir que va a realizar cualquier operación legal. Dado que el bloqueo es obligatorio, se rechazará el open
que permite una operación en conflicto, incluso si el código nunca tuvo la intención de realizar la operación en conflicto, sino que simplemente estaba abriendo el archivo para otro propósito.
Entonces, si el código usa la API C / C ++, o usa la API nativa sin pensar específicamente en estos problemas, terminarán impidiendo el conjunto máximo de operaciones posibles para cada archivo que abran y no podrán abrir un archivo a menos que cada operación posible podría funcionar en él una vez abierto no está en conflicto.
En mi opinión, el método de Windows funcionaría mucho mejor que el método de UNIX si cada programa eligiera sus modos de compartir y los modos abiertos sabiamente y manejara de manera sensata los casos de falla. Sin embargo, el método UNIX funciona mejor si el código no se molesta en pensar en estos problemas. Desafortunadamente, la API básica de C / C ++ no se correlaciona bien con la API de archivos de Windows de una manera que maneja los modos de compartir y los conflictos se abren bien. Entonces el resultado neto es un poco desordenado.