serv04.c 969 B

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