2010-03-11 6 views
7

Al leer acerca de las tuberías en Programación avanzada en el entorno UNIX, noté que después de una horquilla el padre puede close() leer el extremo de una tubería y no cierra el extremo de lectura para el niño. Cuando un proceso se bifurca, ¿se conservan sus descriptores de archivo?Comportamiento de una tubería después de una horquilla()

Lo que quiero decir con esto es que antes del tenedor el descriptor de archivo de lectura de tubería tenía un conteo de retención de 1, y después de la horquilla 2. Cuando el padre cerró su lado de lectura el fd pasó a 1 y se mantiene abierto para el niño. ¿Es esto esencialmente lo que está sucediendo? ¿Este comportamiento también ocurre para los descriptores de archivos regulares?

Respuesta

5

Como se puede leer en la página del manual sobre fork():

El proceso hijo tendrá su propia copia del archivo de los padres descriptores. Cada uno de los descriptores de archivo del niño se referirá a la misma descripción de archivo abierto con el descriptor de archivo correspondiente del padre .

Así que sí, el niño tiene una copia exacta de los descriptores de archivos de los padres y se refiere a todos ellos, incluidos los archivos abiertos.

+0

... a menos que haga algún truco con http://www.opengroup.org/onlinepubs/009695399/functions/pthread_atfork.html (que no debería, eso no es para lo que está ahí) – ephemient

+0

Claro, pero qué has publicado no es un 'fork()' sino una variación de él. – pajton

+0

No, quiero decir que 'pthread_atfork' puede cambiar las acciones del programa en el momento' fork' para (por ejemplo) incluir el cierre de los descriptores de archivos. Pero por defecto eso no sucede, y es extraño abusar de esa interfaz de todos modos. – ephemient

1

Sí, una horquilla duplica todos los descriptores de archivos abiertos.

Por lo tanto, para una tubería típica, una matriz de 2 ranuras (int fd [2]), fd [0] es la misma para el padre y el niño, y así es fd [1].

Puede crear una tubería sin bifurcación y leer/escribir usando fd [0] y fd [1] en un proceso.

+1

¡Conduce al increíble truco de http://cr.yp.to/docs/selfpipe.html! – ephemient

2

La respuesta es sí y sí (lo mismo se aplica a todos los descriptores de archivos, incluidos elementos como los sockets).

En una llamada fork(), el niño obtiene su propia copia separada de cada descriptor de archivo, que cada acto actúa como si hubieran sido creados por dup(). A close() solo cierra el descriptor de archivo específico que se pasó; por ejemplo, si hace n2 = dup(n); close(n);, el archivo (tubería, zócalo, dispositivo ...) al que se refería n permanece abierto; lo mismo se aplica a los descriptores de archivos duplicados por fork() .

Cuestiones relacionadas