Al igual que:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Aunque he leído man fcntl
, no puedo entender qué hace.
Establece el indicador close-on-exec para el descriptor de archivo, lo que hace que el descriptor de archivo se cierre automáticamente (y atómicamente) cuando cualquiera de las exec
funciones -family tiene éxito.
También prueba el valor de retorno para ver si la operación falló, lo cual es bastante inútil si el descriptor de archivo es válido, ya que no existe ninguna condición bajo la cual esta operación deba fallar en un descriptor de archivo válido.
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ónopen(2)
para O_CLOEXEC, por lo que puede establecer esta propiedad cuando abra el archivo, lo que será muy útil una vez que esté ampliamente disponible.open
noaccept
,socket
,pipe
, etc ...dup()
ydup2()
no se ven afectados, por supuesto). Probablemente tendría que tener nuevas funciones con un parámetro adicional de 'modo' o 'banderas', que es presumiblemente la razón por la que no sucedió. Si pudiera usar O_CLOEXEC en socket, entonces podría suponer que clonaríaaccept()
esa bandera en el descriptor que devuelve. Perosocket()
ypipe()
son más complicados.dup
ydup2
se ven afectados. La marca close-on-exec se aplica a los descriptores de archivos, no a las descripciones de archivos abiertos, por lo que no se comparte entre descriptores de archivos duplicados. Eso es una cosa muy buena.dup3
,pipe2
, yaccept4
. Además,socket
tiene laSOCK_CLOEXEC
bandera que puedes combinar con el tipo de enchufe solicitado.Marca el descriptor de archivo para que se
close()
d automáticamente cuando el proceso o cualquier hijofork()
llame a una de lasexec*()
funciones de la familia. Esto es útil para evitar filtrar sus descriptores de archivos a programas aleatorios ejecutados por ejsystem()
.fuente