void sigchld_handler(int s)
{
while(wait(NULL) > 0);
}
(...)
int main (){
(...)
if (listen(sockfd, 10 ) == -1) {
perror("listen");
exit(1);
}
struct sigaction sa;
sa.sa_handler = sigchld_handler; // retira todos os processos ociosos
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
while(1) { // loop principal accept()
sin_size = sizeof(struct sockaddr_in);
if ((nova_fd = accept(sockfd, (struct sockaddr*)&outro_end,&sin_size)) == -1)
{
perror("accept");
continue;
}
printf("servidor: recebeu conexão de%s\n",inet_ntoa(outro_end.sin_addr));
if (!fork()) { // este é o processo-filho
close(sockfd); // o filho não precisa de escutar conexões
if (send(nova_fd, "Olá , Beleza!\n", 14,0) == -1)
perror("send");
close(nova_fd);
exit(0);
}
close(nova_fd); // o processo principal não precisa disso
}
return 0;
}