2010-12-08 10 views
5

Estoy utilizando un conducto sin nombre para la comunicación entre procesos entre un proceso principal y un proceso hijo creado a través de fork(). Estoy usando la función pipe() incluida en unistd.h¿Linux libera automáticamente un conducto sin nombre una vez que se han cerrado ambos descriptores de archivo?

Supongo que una vez que ambos descriptores de archivos se han cerrado (y en ambos procesos), que la tubería se desasigna/libera/destruye/etc. Pero no he encontrado nada en las páginas man que diga esto definitivamente. Estoy haciendo un programa que se ejecutará durante mucho tiempo, por lo que quiero evitar fugas de memoria y otras cosas de esa naturaleza.

Mi cuerpo de la función se ve algo como:

int pipefds[2]; 

pipe(pipefds); 

if (fork() == 0) { 

    close(pipefds[1]); 
    ... 
    //Use pipefds[0] 
    close(pipefds[0]); 

} else { 

    close(pipefds[0]); 
    ... 
    //Use pipefds[1] 
    close(pipefds[1]); 
} 

¿Es seguro asumir que después de esta función termina en el niño y el padre que el tubo ha sido desasignado/liberado/destruido/etc. ?

¿Hay alguna documentación que diga esto definitivamente?

Gracias

Respuesta

6

http://www.opengroup.org/onlinepubs/009695399/functions/close.html

Cuando todos los descriptores de archivo asociados con un tubo o un archivo especial FIFO son cerrada, los datos restantes en el tubo de o FIFO serán descartados.

en realidad no dicen que se liberan todos los recursos, ya que gubbins meollo interno no es "datos restantes en la tubería", pero creo que podemos asumir con seguridad que si su núcleo mantiene nada después de eso, ese es el negocio de su kernel y ninguno de los suyos :-)

5

La documentación de close dice esto.

The close() call deletes a descriptor from the per-process object reference 
table. If this is the last reference to the underlying object, the 
object will be deactivated. 
+0

¡Gracias! Tanto su respuesta como la respuesta de Steve Jossop fueron buenas, pero acepté la respuesta de Steve Jessop porque proporcionaba documentación de una fuente confiable y la documentación menciona explícitamente las canalizaciones. – pcd6623

0

Bueno, lo único que puede hacer es cerrar ambos extremos de la tubería, ¿verdad? Sí, la tubería será desasignada una vez que todas las asas en ambos extremos de la tubería estén cerradas.

Cuestiones relacionadas