serv02m.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "unp.h"
  2. static int nchildren;
  3. static pid_t *pids;
  4. long *cptr, *meter(int); /* for counting #clients/child */
  5. int
  6. main(int argc, char **argv)
  7. {
  8. int listenfd, i;
  9. socklen_t addrlen;
  10. void sig_int(int);
  11. pid_t child_make(int, int, int);
  12. if (argc == 3)
  13. listenfd = Tcp_listen(NULL, argv[1], &addrlen);
  14. else if (argc == 4)
  15. listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
  16. else
  17. err_quit("usage: serv02 [ <host> ] <port#> <#children>");
  18. nchildren = atoi(argv[argc-1]);
  19. pids = Calloc(nchildren, sizeof(pid_t));
  20. cptr = meter(nchildren);
  21. for (i = 0; i < nchildren; i++)
  22. pids[i] = child_make(i, listenfd, addrlen); /* parent returns */
  23. Signal(SIGINT, sig_int);
  24. for ( ; ; )
  25. pause(); /* everything done by children */
  26. }
  27. void
  28. sig_int(int signo)
  29. {
  30. int i;
  31. void pr_cpu_time(void);
  32. /* terminate all children */
  33. for (i = 0; i < nchildren; i++)
  34. kill(pids[i], SIGTERM);
  35. while (wait(NULL) > 0) /* wait for all children */
  36. ;
  37. if (errno != ECHILD)
  38. err_sys("wait error");
  39. pr_cpu_time();
  40. for (i = 0; i < nchildren; i++)
  41. printf("child %d, %ld connections\n", i, cptr[i]);
  42. exit(0);
  43. }