| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- /* include child_make */
- #include "unp.h"
- #include "child.h"
- pid_t
- child_make(int i, int listenfd, int addrlen)
- {
- int sockfd[2];
- pid_t pid;
- void child_main(int, int, int);
- Socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);
- if ( (pid = Fork()) > 0) {
- Close(sockfd[1]);
- cptr[i].child_pid = pid;
- cptr[i].child_pipefd = sockfd[0];
- cptr[i].child_status = 0;
- return(pid); /* parent */
- }
- Dup2(sockfd[1], STDERR_FILENO); /* child's stream pipe to parent */
- Close(sockfd[0]);
- Close(sockfd[1]);
- Close(listenfd); /* child does not need this open */
- child_main(i, listenfd, addrlen); /* never returns */
- }
- /* end child_make */
- /* include child_main */
- void
- child_main(int i, int listenfd, int addrlen)
- {
- char c;
- int connfd;
- ssize_t n;
- void web_child(int);
- printf("child %ld starting\n", (long) getpid());
- for ( ; ; ) {
- if ( (n = Read_fd(STDERR_FILENO, &c, 1, &connfd)) == 0)
- err_quit("read_fd returned 0");
- if (connfd < 0)
- err_quit("no descriptor from read_fd");
- web_child(connfd); /* process request */
- Close(connfd);
- Write(STDERR_FILENO, "", 1); /* tell parent we're ready again */
- }
- }
- /* end child_main */
|