Bonjour à tous,
Voila j'ai une application de client-serveur basé sur des fork() : à chaque connexion d'un client, un processus fils est créé jusqu'à la déconnexion de celui-ci.
Lorsque je connecte un client par seconde, le processus zombie est bien détruit, mais lorsque je simule une grosse charge du serveur (genre 100 connexions par seconde) des processus zombies restent présents dans la liste des processus.
Je sais qu'une telle charge est rare mais cela peut arriver. Voici une partie de code pour illustrer ce que je fais.
Chez le client:Sur le serveur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 do { usleep(1000); sockfd = connect_server("127.0.0.1", 9611); if (sockfd > 0) { send_data(sockfd, "test\n"); close_connection(sockfd); } } while (1);Au lancement du programme j'appelle la méthode sig_chld(); définie comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /* Un cliente se ha conectado */ pid = fork(); if(pid < 0) { result = E_CANT_FORK; } else if(pid == 0) { result = create_new_client_process(sockfd); memset(&msgdisbuf, 0, sizeof(msgdisbuf)); msgdisbuf.type = MSGDISTYPE; memcpy(&msgdisbuf.sockfd, &sockfd, sizeof(sockfd)); if (msgsnd(msgdisid, &msgdisbuf, sizeof(msgdisbuf.sockfd), IPC_NOWAIT) < 0) { perror("msgsnd"); } exit(0); /* Finalizar proceso hijo */ }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void sig_chld() { signal(SIGCHLD, SIG_IGN); wait(NULL); signal(SIGCHLD, sig_chld); }
Partager