child02l.c 783 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "unp.h"
  2. pid_t
  3. child_make(int i, int listenfd, int addrlen)
  4. {
  5. pid_t pid;
  6. void child_main(int, int, int);
  7. if ( (pid = Fork()) > 0)
  8. return(pid); /* parent */
  9. child_main(i, listenfd, addrlen); /* never returns */
  10. }
  11. void
  12. child_main(int i, int listenfd, int addrlen)
  13. {
  14. int connfd;
  15. void web_child(int);
  16. fd_set rset;
  17. socklen_t clilen;
  18. struct sockaddr *cliaddr;
  19. cliaddr = Malloc(addrlen);
  20. printf("child %ld starting\n", (long) getpid());
  21. FD_ZERO(&rset);
  22. for ( ; ; ) {
  23. FD_SET(listenfd, &rset);
  24. Select(listenfd+1, &rset, NULL, NULL, NULL);
  25. if (FD_ISSET(listenfd, &rset) == 0)
  26. err_quit("listenfd readable");
  27. clilen = addrlen;
  28. connfd = Accept(listenfd, cliaddr, &clilen);
  29. web_child(connfd); /* process the request */
  30. Close(connfd);
  31. }
  32. }