grupo dynamic de proceso C

Estoy escribiendo un progtwig en UNIX en C. Tengo que escribir un progtwig cliente-servidor (TCP) en sockets. Cliente envía alguna información y respuesta del servidor. No importa lo que el cliente envíe o reciba porque escribí el código correctamente. Pero la última parte de la tarea es muy difícil para mí.

1) Una conexión – un proceso hijo.

2) Para conexiones nuevas que utilizan procesos previos a la ejecución desde un grupo.

3) El tamaño de la agrupación es dynamic. Si la cantidad de procesos libres (que no atienden al cliente) se redujo a N, se deben crear nuevos procesos, si se convierten en más de K se deben terminar los procesos “adicionales”.

Este es mi código. Cada conexión crea un nuevo proceso secundario utilizando fork() Cada conexión se ejecuta en un nuevo proceso. ¿Pero cómo hacer pool dynamic que dije anteriormente?
Por favor, ayuda, es muy importante! Esto es lo último que debo hacer.

Código del servidor:

 int main(int argc, char * argv[]) { int cfd; int listener = socket(AF_INET, SOCK_STREAM, 0); //create listiner socket if(listener < 0){ perror("socket error"); return 1; } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); int binding = bind(listener, (struct sockaddr *)&addr, sizeof(addr)); if(binding < 0){ perror("binding error"); return 1; } listen(listener, 1); //listen for new clients signal(SIGCHLD,handler); int pid; for(;;) // infinity loop on server { cfd = accept(listener, NULL, NULL); //client socket descriptor pid = fork(); //make child proc if(pid == 0) //in child proc... { close(listener); //close listener socket descriptor ... //some server actions that I do.(receive or send) close(cfd); // close client fd return 0; } close(cfd); } return 0; } 

Esta es una pregunta de diseño o architecture, demasiado amplia para una respuesta definitiva con código.

Entonces, usted sabe que desea dar servicio a cada nueva conexión en su propio proceso. Sus otras dos restricciones plantean (al menos) dos preguntas:

Primero, ¿cómo se enruta una nueva conexión a uno de los N que ya tienen trabajadores?

Esto es comparativamente fácil. Los diseños más comunes aquí son:

  • Cada trabajador hereda el conector de escucha y realiza su propia aceptación ()
    Los trabajadores pueden conectar el conector de escucha, de modo que solo uno esté listo para llamar a accept () en un momento dado, o cada uno podría simplemente llamar a accept (), pero en ese caso tenga cuidado con el rebaño de truenos .
  • Los trabajadores reciben conexiones ya aceptadas () de algún otro proceso a través del paso del descriptor de archivos UNIX .
    Ver, por ejemplo, esta pregunta SO .

En segundo lugar, ¿cómo nos aseguramos de que los procesos de trabajadores inactivos de NK estén disponibles?

Esta es una pregunta más amplia, una que deberá responder en función de su comodidad y de cualquier otra limitación.

Debe saber, no simplemente cuántos trabajadores están vivos, sino qué trabajadores están inactivos (“libres”). Tener un proceso de padres que haga un seguimiento de sus hijos es un comienzo obvio, pero eso no distingue a los trabajadores inactivos de los trabajadores ocupados por sí mismos. ¿Podría usar una tabla de estado compartida, mutexed, ya sea un archivo o en la memoria compartida? ¿O tal vez cada niño comunica su estado a través de un socketpair (), el mismo que se usa para pasar el descriptor de archivo, al padre?

Entonces, ¿cómo matar a un trabajador inactivo de forma segura si, por alguna razón, supera a K ? Señales? Un comando dado sobre ese mismo socketpair ()? ¿Puede un trabajador recientemente inactivo verificar que la tabla de estado termine si el estado de inactividad excede a K ? ¿Cómo se recupera de la terminación accidental del trabajador (por ejemplo, SEGV)? Etcétera etcétera.

El módulo prefork MPM de Apache implementa un diseño posible en este espacio problemático. Es posible que desee consultar para ideas.

Su código no parece satisfacer la condición número 2. Su grupo de procesos no se está ejecutando previamente. Los procesos se crean cuando aceptas la conexión. Una interpretación le haría hacer un montón de bifurcaciones y luego hacer que los procesos bifurcados esperen la aceptación. Uno lo conseguiría y luego haría el procesamiento.

El proceso de los padres debe realizar un seguimiento de cuántos niños hay por ahí. Usted podría hacer esto en un hilo que hace una espera. Esto esperará a que un niño muera. (vea man 2, espere por varios sabores). Cuando el número de procesos se vuelve demasiado grande, puede enviar una señal que los niños podrían detectar para terminar correctamente. Sin embargo, estoy asumiendo que el proceso de los padres NO llevaría a más hijos hasta que algunos de ellos murieran y no se sobreescribiera el límite de ‘K’.