2011-05-16 8 views
25

Tengo un programa que sirve como un servidor TCP que escucha el puerto 5000, por ejemplo.¿Cómo se maneja la conexión de socket en un proceso bifurcado?

Ahora quiero ejecutar otro proceso de línea de comandos para ejecutar en paralelo con este servidor. Sé que la forma correcta de hacerlo es bifurcar el servidor, que llamar a "exec" ....

Mi pregunta es, ¿el proceso hijo también es "propietario" de este puerto 5000? Si deseo liberar este puerto 5000, ¿tengo que matar tanto el proceso principal como el secundario?

Tengo curiosidad por saber cómo se maneja esta conexión en el bifurcación.

+0

¿Tenedor() cuando hay una nueva conexión entrante o antes de eso? – Simone

+0

@Simone, me inclino después de que se construye una nueva conexión. – CodeNoob

+0

@ushfish por lo que la respuesta de Matt es correcta. – Simone

Respuesta

20
  1. Primero, accept() la conexión entrante. El proceso de aceptación ahora tiene un control para el socket de escucha y el socket recientemente aceptado.
  2. y Tenedor:
    • En el niño:
      1. Cerrar el socket de escucha.
      2. Haga cosas con el zócalo aceptado.
    • En el padre:
      1. cierra el socket aceptado.
      2. Reanudar el ciclo de aceptación.

serán recuperados los diversos recursos de socket cuando todas las referencias al mango están cerrados. Si un proceso finaliza, todos sus identificadores se cierran implícitamente. Por lo tanto, si un niño cierra el identificador hereda el socket de escucha, el único identificador restante para ese socket existe en el padre. Luego, el socket de escucha se reclamará cuando el padre termine, o cierra este handle explícitamente.

13

Sí, hace
Cada vez que se crea un proceso secundario, obtiene una copia de la tabla de descriptores de archivos del proceso principal. Y hay un recuento de referencias correspondiente a cada descriptor de archivo, es decir, el número de procesos que actualmente acceden al archivo/socket. Entonces, si un socket está abierto en el proceso maestro y se crea un proceso hijo, el recuento de referencias se incrementa, ya que ahora también está abierto en el proceso secundario, y cuando se cierra en cualquiera de los procesos, disminuye. Un socket finalmente se cierra cuando el recuento de referencia llega a cero.

Cuestiones relacionadas