¿Qué hace el indicador FD_CLOEXEC fcntl()?

3 minutos de lectura

avatar de usuario
ventilador de compilación

Al igual que:

if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...

Aunque he leído man fcntlno puedo entender lo que hace.

Establece el cierre-en-ejecutivo marca para el descriptor de archivo, lo que hace que el descriptor de archivo se cierre automáticamente (y atómicamente) cuando cualquiera de los exec-funciones familiares triunfan.

También prueba el valor devuelto para ver si la operación falló, lo que es bastante inútil si el descriptor de archivo es válido, ya que no hay ninguna condición bajo la cual esta operación deba fallar en un descriptor de archivo válido.

  • Tenga en cuenta que no hace nada acerca de vaciar cualquier flujo de archivos (FILE *) asociado con el descriptor de archivo. Un uso válido de FD_CLOEXEC es cerrar un archivo de registro que el proceso principal tiene abierto al ejecutar un proceso de shell. Tenga en cuenta que POSIX 2008 tiene una opción para open(2) para O_CLOEXEC, por lo que puede configurar esta propiedad cuando abra el archivo, lo que será muy útil una vez que esté ampliamente disponible.

    –Jonathan Leffler

    25 de mayo de 2011 a las 14:11

  • Establecer el indicador atómicamente cuando se abre el archivo es bastante esencial para cualquier programa subproceso que pueda estar abriendo archivos mientras que otro subproceso podría estar ejecutando programas externos. Lamentablemente solo está disponible para open y no accept, socket, pipeetc…

    – R.. GitHub DEJA DE AYUDAR A ICE

    25 de mayo de 2011 a las 14:19

  • Sí, hay problemas de diseño al agregar O_CLOEXEC o equivalente a las otras funciones de creación de descriptores de archivos (aunque dup() y dup2() no se ven afectados, por supuesto). Probablemente tendría que tener nuevas funciones con un parámetro adicional de ‘modo’ o ‘flags’, que presumiblemente es la razón por la que no sucedió. Si pudiera usar O_CLOEXEC en el socket, entonces podría suponer que accept() clonaría esa bandera en el descriptor que devuelve. Pero socket() y pipe() son más complicados.

    –Jonathan Leffler

    25 de mayo de 2011 a las 14:27

  • dup y dup2 Son afectados. El indicador close-on-exec se aplica a los descriptores de archivos, no a las descripciones de archivos abiertos, por lo que no se comparte entre los descriptores de archivos duplicados. Eso es una cosa muy buena.

    – R.. GitHub DEJA DE AYUDAR A ICE

    25 de mayo de 2011 a las 14:33

  • Siguiendo la conversación en los comentarios, POSIX ha adoptado para su inclusión en el próximo número nuevas interfaces que corrigen las deficiencias: dup3, pipe2y accept4. También, socket tiene el SOCK_CLOEXEC bandera que puede combinar con el tipo de socket solicitado.

    – R.. GitHub DEJA DE AYUDAR A ICE

    10/03/2014 a las 16:30

Marca el descriptor del archivo para que sea close()d automáticamente cuando el proceso o cualquier niño lo fork()s llama a uno de los exec*() familia de funciones. Esto es útil para evitar filtrar los descriptores de archivos a programas aleatorios ejecutados, por ejemplo system().

  • ¿Es esto un problema de seguridad?

    – zach

    29 de julio de 2017 a las 11:14

  • @zach podrías decirlo; pero entonces realmente cualquier refactorización que haga, como encapsular una lógica dispersa en una sola entidad, puede llamarse un “problema de seguridad”, porque reduce la probabilidad de errores debido al uso incorrecto de esa entidad, y “un error” es algo abstracto eso incluye fallas de segmento y fugas de información en particular.

    – Hola angel

    10 de enero de 2019 a las 22:23

  • Así que estoy refactorizando un código de socket, y entre obtener el socket y conectarse al servidor remoto, usan F_SETFD para agregar el indicador FD_CLOEXEC al FD del socket. Luego, después de una conexión exitosa, se elimina el FD_CLOEXEC. No puedo encontrar ninguna llamada exec () involucrada en esta área de código y me pregunto si son restos de código antiguo que deberían haberse eliminado pero no lo fueron. No estoy seguro de qué buscar para averiguar el propósito de todo.

    – JoeManiaci

    17 de agosto de 2020 a las 20:57

¿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