fcntl, lockf, ¿cuál es mejor usar para bloquear archivos?

7 minutos de lectura

Buscando información sobre el ventajas y desventajas de ambos fcntl y bloquear para el bloqueo de archivos. Por ejemplo, ¿cuál es mejor usar para la portabilidad? Actualmente estoy codificando un demonio de Linux y me pregunto cuál es más adecuado para aplicar la exclusión mutua.

avatar de usuario
Brian R. Bondy

¿Cuál es la diferencia entre lockf y fcntl:

En muchos sistemas, el lockf() la rutina de la biblioteca es solo un envoltorio fcntl(). Es decir lockf ofrece un subconjunto de la funcionalidad que fcntl lo hace.

Fuente

Pero en algunos sistemas, fcntl y lockf Las cerraduras son completamente independientes.

Fuente

Dado que depende de la implementación, asegúrese de usar siempre la misma convención. Entonces, siempre use lockf de ambos procesos o siempre use fcntl. Es muy probable que sean intercambiables, pero es más seguro usar el mismo.

No importa cuál elijas.


Algunas notas sobre bloqueos obligatorios y de asesoramiento:

El bloqueo en Unix/Linux es por defecto consultivo, lo que significa que otros procesos no necesitan seguir las reglas de bloqueo establecidas. Por lo tanto, no importa de qué manera bloquee, siempre que sus procesos de cooperación también usen la misma convención.

Linux soporta obligatorio bloqueo, pero solo si su sistema de archivos está montado con la opción activada y los atributos especiales de archivo establecidos. Puedes usar mount -o mand para montar el sistema de archivos y establecer los atributos del archivo g-x,g+s para habilitar los bloqueos obligatorios, luego use fcntl o lockf. Para obtener más información sobre cómo funcionan los bloqueos obligatorios, consulte aquí.

Tenga en cuenta que los bloqueos no se aplican al archivo individual, sino al inodo. Esto significa que 2 nombres de archivo que apunten a los mismos datos de archivo compartirán el mismo estado de bloqueo.

En Windows, por otro lado, puede abrir activamente un archivo de forma exclusiva, y eso impedirá que otros procesos lo abran por completo. Incluso si quieren. Es decir, los candados son obligatorios. Lo mismo ocurre con Windows y los bloqueos de archivos. Cualquier proceso con un identificador de archivo abierto con acceso adecuado puede bloquear una parte del archivo y ningún otro proceso podrá acceder a esa parte.


Cómo funcionan los bloqueos obligatorios en Linux:

Con respecto a los bloqueos obligatorios, si un proceso bloquea una región de un archivo con un bloqueo de lectura, entonces otros procesos pueden leer pero no escribir en esa región. Si un proceso bloquea una región de un archivo con un bloqueo de escritura, entonces otros procesos no pueden leer ni escribir en el archivo. Lo que sucede cuando a un proceso no se le permite acceder a la parte del archivo depende de si especificó O_NONBLOCK O no. Si se configura el bloqueo esperará a realizar la operación. Si no se establece ningún bloqueo, obtendrá un código de error de EAGAIN.


Advertencia NFS:

Tenga cuidado si está utilizando comandos de bloqueo en un montaje NFS. El comportamiento no está definido y la implementación varía ampliamente si se usa solo un bloqueo local o si se admite el bloqueo remoto.

  • Esto ya no es correcto. El bloqueo de archivos funciona en nfs 3.0, pero solo con fcntl, no con flock

    – franco

    2 de julio de 2010 a las 16:23

  • “Pero en algunos sistemas, los bloqueos fcntl y lockf son completamente independientes” — No. En algunos sistemas, los bloqueos fcntl y flock son completamente independientes, como se explica en el artículo al que se vinculó. Sin embargo, los bloqueos fcntl y lockf siempre están relacionados (simplemente no relacionados con flock).

    – Programador de Windows

    20 de enero de 2011 a las 1:57

Ambas interfaces son parte del estándar POSIX, y actualmente ambas interfaces están disponibles en la mayoría de los sistemas (acabo de comprobar Linux, FreeBSD, Mac OS X y Solaris). Por lo tanto, elige el que mejor se adapte a tus necesidades y utilízalo.

Una palabra de precaución: no se especifica qué sucede cuando un proceso bloquea un archivo usando fcntl y otro usando lockf. En la mayoría de los sistemas, estas son operaciones equivalentes (de hecho, en Linux, lockf se implementa sobre fcntl), pero POSIX dice que su interacción no está especificada. Entonces, si está interoperando con otro proceso que usa una de las dos interfaces, elija la misma.

Otros han escrito que los bloqueos son solo de asesoramiento: usted es responsable de verificar si una región está bloqueada. Además, no use las funciones de stdio, si desea usar la función de bloqueo.

avatar de usuario
vladr

Sus principales preocupaciones, en este caso (es decir, cuando “Codificando un demonio de Linux y preguntándose cuál es más adecuado para usar para hacer cumplir la exclusión mutua“), debiera ser:

  1. ¿El archivo bloqueado será local o puede estar en NFS?
    • por ejemplo, ¿puede el usuario engañarlo para que cree y bloquee el archivo pid de su daemon en NFS?
  2. ¿Cómo se comportará la cerradura cuando forking, o cuando el proceso daemon se termina con perjuicio extremo, por ejemplo, kill -9?

los flock y fcntl los comandos se comportan de manera diferente en ambos casos.

Mi recomendación sería usar fcntl. Puede referirse a la Artículo de bloqueo de archivos en Wikipedia para una discusión en profundidad de los problemas involucrados con ambas soluciones:

Tanto flock como fcntl tienen peculiaridades que en ocasiones desconciertan a los programadores de otros sistemas operativos. Que los bloqueos de bandada funcionen en sistemas de archivos de red, como NFS, depende de la implementación. En los sistemas BSD, las llamadas de bandada son exitosas sin operaciones. En Linux anterior a 2.6.12, las llamadas de bandada en archivos NFS solo actuarían localmente. Kernel 2.6.12 y superior implementan llamadas de bandada en archivos NFS usando bloqueos de rango de bytes POSIX. Estos bloqueos serán visibles para otros clientes NFS que implementen bloqueos fcntl()/POSIX.1 Las actualizaciones y degradaciones de bloqueo liberan el antiguo bloqueo antes de aplicar el nuevo bloqueo. Si una aplicación degrada un bloqueo exclusivo a un bloqueo compartido mientras otra aplicación está bloqueada en espera de un bloqueo exclusivo, la última aplicación obtendrá el bloqueo exclusivo y la primera aplicación quedará bloqueada. Todos los bloqueos fcntl asociados con un archivo para un proceso determinado se eliminan cuando ese proceso cierra cualquier descriptor de archivo para ese archivo, incluso si nunca se solicitó un bloqueo para ese descriptor de archivo. Además, los bloqueos fcntl no los hereda un proceso hijo. La semántica de cierre de fcntl es particularmente problemática para aplicaciones que llaman a bibliotecas de subrutinas que pueden acceder a archivos.

Encontré un problema al usar fcntl y flock recientemente que sentí que debería informar aquí ya que la búsqueda de cualquiera de los términos muestra esta página cerca de la parte superior en ambos.

Tenga en cuenta que los bloqueos BSD, como se mencionó anteriormente, son consultivo. Para los que no conocen OSX (darwin) es BSD. Esto debe recordarse al abrir un archivo para escribir en él.

Para usar fcntl/flock primero debe abrir el archivo y obtener su ID. Sin embargo, si ha abierto el archivo con “w”, el archivo será instantáneamente puesto a cero. Si su proceso luego no puede obtener el bloqueo porque el archivo está en uso en otro lugar, lo más probable es que regrese, dejando el archivo como 0kb. El proceso que tenía el bloqueo ahora encontrará que el archivo se ha desvanecido debajo de él, normalmente siguen resultados catastróficos.

Para remediar esta situación, al usar el bloqueo de archivos, Nunca abra el archivo “w”, pero en su lugar ábralo “a”, para agregar. Luego, si el bloqueo se adquiere con éxito, puede borrar el archivo de manera segura como lo habría hecho “w”, es decir. :

fseek(fileHandle, 0, SEEK_SET);//mover al inicio

ftruncate(fileno((FILE *) fileHandle), 0);//limpiarlo

Esta fue una lección desagradable para mí.

Como solo está codificando un demonio que lo usa para la exclusión mutua, son equivalentes, después de todo, su aplicación solo necesita ser compatible consigo misma.

El truco con los mecanismos de bloqueo de archivos es ser consistente: use uno y apéguese a él. Variarlos es una mala idea.

Supongo aquí que el sistema de archivos será local; si no lo es, entonces todas las apuestas están canceladas, NFS / otros sistemas de archivos de red manejan el bloqueo con diversos grados de efectividad (en algunos casos ninguno)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad