/ / ¿Tenedor antes o después de aceptar conexiones? - c, linux, unix, redes

Tenedor antes o después de aceptar las conexiones? - c, linux, unix, redes

El siguiente fragmento de código crea 4 procesos, todos compartiendo el mismo conector de escucha.

¿Hay algún peligro en hacer esto? ¿Debo tener siempre un proceso de escucha y una bifurcación después de que se acepten las conexiones, de la manera convencional?

for (p = 0; p < 3; p++) {
pid = fork();
if (pid == 0) break;
}
while (1) {
unsigned int clientlen = sizeof(echoclient);
/* Wait for client connection */
if ((clientsock =
accept(serversock, (struct sockaddr *) &echoclient,
&clientlen)) < 0) {
die("Failed to accept client connection");
}
fprintf(stdout, "Process No. %d - Client connected: %sn",
p,
inet_ntoa(echoclient.sin_addr));
handle_client(clientsock);
}

(Entiendo que bifurcar después de aceptar permiteUn programa para realizar un proceso por conexión. Estoy jugando con proto-hilos y varias cosas asincrónicas, así que solo estoy considerando tener un proceso por núcleo.)

Respuestas

10 por respuesta № 1

Puedes hacerlo de cualquier manera.

Como se nota, bifurcar después de la aceptación es unohijo por cliente / conexión. Bifurcar antes de la aceptación (pero después de la escucha) generalmente se conoce como pre-forking. Cada uno de los niños espera la aceptación y cualquier hijo recibe la conexión entrante que la procesa. Esto es seguro siempre y cuando la aceptación sea realizada por el kernel que (creo) cualquier unix moderno hace. Si no es así, debe colocar algún tipo de bloqueo de IPC (exclusión mutua, etc.) alrededor de la aceptación. La ventaja de pre-forking es que no necesita pasar por el costo de una bifurcación para cada conexión, ya tiene un grupo existente.