Finally, reaping all zombies
This commit is contained in:
parent
4d959ce088
commit
7e49c722ab
20
src/server.c
20
src/server.c
@ -4,6 +4,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -59,9 +60,20 @@ void handle_connection(int fd)
|
|||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles child process removal (to prevent zombies)
|
||||||
|
*
|
||||||
|
* @param signum
|
||||||
|
*/
|
||||||
void handle_process_termination(int signum)
|
void handle_process_termination(int signum)
|
||||||
{
|
{
|
||||||
wait(NULL);
|
int status;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
do {
|
||||||
|
pid = waitpid(-1, &status, WNOHANG);
|
||||||
|
}
|
||||||
|
while (pid > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,6 +106,8 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
printf("Waiting for connection on port %s...\n", port);
|
printf("Waiting for connection on port %s...\n", port);
|
||||||
|
|
||||||
|
signal(SIGCHLD, handle_process_termination);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
socklen_t sin_size = sizeof cli_addr;
|
socklen_t sin_size = sizeof cli_addr;
|
||||||
@ -122,10 +136,8 @@ int main(int argc, char *argv[])
|
|||||||
handle_connection(client_fd);
|
handle_connection(client_fd);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
close(client_fd);
|
close(client_fd);
|
||||||
signal(SIGCHLD, handle_process_termination);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user