/* Código concorrente de um servidor daytime como daemon. Não é o * código ideal (deveria tratar melhor os erros das funções por * exemplo) mas é suficiente para começar a entender como se escreve * servidores TCP usando sockets. * * RFC do daytime: http://www.faqs.org/rfcs/rfc867.html * * Prof. Daniel Batista em 30/11/2016. Baseado no código disponibilizado no livro do Stevens * * Bugs? Tente consertar primeiro! Depois me envie email :) batista@ime.usp.br */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAXLINE 100 #define LISTENQ 1 #define MAXFD 64 void sig_chld(int signo) { pid_t pid; int status; while ( (pid = waitpid(-1, &status, WNOHANG)) > 0 ) syslog(LOG_INFO|LOG_USER,"Filho \%d terminou\n", pid); return; } int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; pid_t pid; int i; // Fazendo o terminal achar que o processo terminou if ((pid = fork()) < 0) return (-1); else if (pid) _exit(0); // Sim, sei que na aula eu mostrei com exit. Veja a // manpage para entender pq o ideal é usar _exit // Filho continua sem estar associado ao shell if (setsid() < 0) return(-1); if (signal(SIGHUP, SIG_IGN) == SIG_ERR) return(-1); if ((pid = fork()) < 0) return (-1); else if (pid) _exit(0); chdir("/"); for(i=0;i