serv01.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* include serv01 */
  2. #include "unp.h"
  3. int
  4. main(int argc, char **argv)
  5. {
  6. int listenfd, connfd;
  7. pid_t childpid;
  8. void sig_chld(int), sig_int(int), web_child(int);
  9. socklen_t clilen, addrlen;
  10. struct sockaddr *cliaddr;
  11. if (argc == 2)
  12. listenfd = Tcp_listen(NULL, argv[1], &addrlen);
  13. else if (argc == 3)
  14. listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
  15. else
  16. err_quit("usage: serv01 [ <host> ] <port#>");
  17. cliaddr = Malloc(addrlen);
  18. Signal(SIGCHLD, sig_chld);
  19. Signal(SIGINT, sig_int);
  20. for ( ; ; ) {
  21. clilen = addrlen;
  22. if ( (connfd = accept(listenfd, cliaddr, &clilen)) < 0) {
  23. if (errno == EINTR)
  24. continue; /* back to for() */
  25. else
  26. err_sys("accept error");
  27. }
  28. if ( (childpid = Fork()) == 0) { /* child process */
  29. Close(listenfd); /* close listening socket */
  30. web_child(connfd); /* process request */
  31. exit(0);
  32. }
  33. Close(connfd); /* parent closes connected socket */
  34. }
  35. }
  36. /* end serv01 */
  37. /* include sigint */
  38. void
  39. sig_int(int signo)
  40. {
  41. void pr_cpu_time(void);
  42. pr_cpu_time();
  43. exit(0);
  44. }
  45. /* end sigint */