serv02.lc 2.2 KB

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