serv02.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* include serv02 */
  2. #include "unp.h"
  3. static int nchildren;
  4. static pid_t *pids;
  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. 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. /* end serv02 */
  27. /* include sigint */
  28. void
  29. sig_int(int signo)
  30. {
  31. int i;
  32. void pr_cpu_time(void);
  33. /* 4terminate 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. exit(0);
  42. }
  43. /* end sigint */