serv03m.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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: serv03 [ <host> ] <port#> <#children>");
  18. nchildren = atoi(argv[argc-1]);
  19. pids = Calloc(nchildren, sizeof(pid_t));
  20. cptr = meter(nchildren);
  21. my_lock_init("/tmp/lock.XXXXXX"); /* one lock file for all children */
  22. for (i = 0; i < nchildren; i++)
  23. pids[i] = child_make(i, listenfd, addrlen); /* parent returns */
  24. Signal(SIGINT, sig_int);
  25. for ( ; ; )
  26. pause(); /* everything done by children */
  27. }
  28. void
  29. sig_int(int signo)
  30. {
  31. int i;
  32. void pr_cpu_time(void);
  33. /* terminate all children */
  34. for (i = 0; i < nchildren; i++)
  35. kill(pids[i], SIGTERM);
  36. while (wait(NULL) > 0) /* wait for all children */
  37. ;
  38. if (errno != ECHILD)
  39. err_sys("wait error");
  40. pr_cpu_time();
  41. for (i = 0; i < nchildren; i++)
  42. printf("child %d, %ld connections\n", i, cptr[i]);
  43. exit(0);
  44. }