Ejemplo n.º 1
0
int
main(int argc, char **argv)
{
	int			listenfd, i;
	socklen_t	addrlen;
	void		sig_int(int);
	pid_t		child_make(int, int, int);

	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv03 [ <host> ] <port#> <#children>");
	nchildren = atoi(argv[argc-1]);
	pids = Calloc(nchildren, sizeof(pid_t));
	cptr = meter(nchildren);

	my_lock_init("/tmp/lock.XXXXXX");	/* one lock file for all children */
	for (i = 0; i < nchildren; i++)
		pids[i] = child_make(i, listenfd, addrlen);	/* parent returns */

	Signal(SIGINT, sig_int);

	for ( ; ; )
		pause();	/* everything done by children */
}
Ejemplo n.º 2
0
void child_main_loop(void)
{
    unsigned int i;
    int connfd;
    unsigned int busy = 1;

    while(1){
        if(QUIT) return;
        socklen_t size = sizeof(struct sockaddr_in);
        struct sockaddr_in their_addr;
        connfd = Accept(listenfd, (struct sockaddr*)&their_addr, &size); 

        while(1){
            for(i = 0; i != CHILD_MAXCLIENTS; i++){
                struct child_s child = child_ptr[i];
                if(child.status == T_WAITING){
                    child.status = T_CONNECTED;
                    child.connfd = connfd;
                    child_ptr[i] = child;
                    child_make(&child_ptr[i]);
                    busy = 0;
                    break;
                }
            }
            if(!busy) break;
        }
    }
}
Ejemplo n.º 3
0
int main(int argc, char *argv[])
{
	int listenfd , i;
	socklen_t addrlen;
	void sig_int(int);
	pid_t child_make(int,int,int);

	if(argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if(argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv02 [<host>] <port#> <#children>");

	nchildren = atoi(argv[argc-1]);
	pids = (pid_t*)Calloc(nchildren, sizeof(pid_t));

	
	cptr = meter(nchildren);

	for (i = 0; i < nchildren; ++i)
	{
		/* code */
		pids[i] = child_make(i, listenfd, addrlen);
	}

	Signal(SIGINT, sig_int);
	for(;;)
		pause();
}
Ejemplo n.º 4
0
int main()
{
    int sock, i;
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(PORT);

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0 )
    {
        err_exit("socket _failed");
    }

    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        err_exit("bind failed");
    }

    if (listen(sock, 5) < 0)
    {
        err_exit("listen failed");
    }

    for (i = 0; i < COUNT; i++)
    {
        child_make(sock, sizeof(addr));
    }
}
Ejemplo n.º 5
0
int main(int argc, char **argv)
{
    int       listenfd, i;
    socklen_t addrlen;
    void      sig_int(int);
    pid_t     child_make(int, int, int);

    if (argc == 3) {
        listenfd = tcp_listen(NULL, argv[1], &addrlen);
    } else if (argc == 4) {
        listenfd = tcp_listen(argv[1], argv[2], &addrlen);
    } else {
        err_quit("usage: serv02m [ <host> ] <port#> <#children>");
    }
    nchildren = atoi(argv[argc-1]);
    pids = (pid_t *) calloc(nchildren, sizeof(pid_t));
    cptr = meter(nchildren);

    for (i = 0; i < nchildren; i++) {
        pids[i] = child_make(i, listenfd, addrlen); // parent returns
    }
    signal(SIGINT, sig_int);

    for ( ; ; ) {
        pause();    // everything done by children
    }
}
Ejemplo n.º 6
0
int main(int argc, char * argv[]) {
  int listenfd;
  int num;
  int i;
  
  if (argc < 2) {
    print_usage();
  }
  
  num = atoi(argv[1]);
  idle_num = num;

  fprintf(stdout, "%d Channels are running ... \n", num);
  
  //to lock the log file
  lock_init(LOG_LOCK);
  
  listenfd = init_server();
  pids = (pid_t *)(malloc(sizeof(pid_t) * num));
  for (i = 0; i < num; i++) {
    pids[i] = child_make(i, listenfd);
  }

  signal_wrapper(SIGINT, sig_int);
  close_wrapper(listenfd);
  while(true)
    pause();
  return 0;
}
	int
main(int argc, char **argv)
{
	int			listenfd, i;
	socklen_t	addrlen;
	void		sig_int(int);
	pid_t		child_make(int, int, int);

	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: ./server_prefork_meter [ <host> ] <port#> <#children>");
	nchildren = atoi(argv[argc-1]);
	pids = calloc(nchildren, sizeof(pid_t));
	cptr = meter(nchildren);
	if(pids == NULL)
	{
		err_sys("calloc");
	}

	for (i = 0; i < nchildren; i++)
		pids[i] = child_make(i, listenfd, addrlen);	/* parent returns */

	if (signal(SIGINT, sig_int) == SIG_ERR)
		perror("signal SIGINT");

	for ( ; ; )
		pause();	/* everything done by children */
}
Ejemplo n.º 8
0
int
main(int argc, char **argv)
{
	int			listenfd, i;
	socklen_t	addrlen;
	void		sig_int(int);
	pid_t		child_make(int, int, int);

	if (argc == 3) {
		listenfd = tcp_listen(NULL, argv[1], &addrlen);
	} else if (argc == 4) {
		listenfd = tcp_listen(argv[1], argv[2], &addrlen);
	} else {
		fprintf(stderr, "usage: serv02 [ <host> ] <port#> <#children>\n");
		exit(1);
	}
	nchildren = atoi(argv[argc-1]);
	if ((pids = calloc(nchildren, sizeof(pid_t))) == NULL) {
		perror("calloc error");
		exit(1);
	}

	for (i = 0; i < nchildren; i++)
		pids[i] = child_make(i, listenfd, addrlen);	/* parent returns */

	if (signal(SIGINT, sig_int) == SIG_ERR) {
		perror("signal error");
		exit(1);
	}

	for ( ; ; )
		pause();	/* everything done by children */
}
Ejemplo n.º 9
0
int main(int argc, char const *argv[])
{
	int i;
	
	pids = (pid_t *)calloc(NCHILD,sizeof(pid_t));
	for (i = 0; i < NCHILD; ++i)
	{
		pids[i] = child_make();
	}
	printf("pid = %d, ppid = %d\n", getpid(),getppid());
	return 0;
}
Ejemplo n.º 10
0
int main(int argc, char* argv[])
{
    int iListenFd;
    sockaddr_in oBindAddr;
    sockaddr_in oCliAddr;
    socklen_t clilen;

    if (argc < 2)
    {
		printf("usage:Serv00 <port> <children>\n");
		return -1;
    }
    printf("argc =%d\n", argc);
    
    oBindAddr.sin_family = AF_INET;
    oBindAddr.sin_port	 = htons(atoi(argv[1]));
    oBindAddr.sin_addr.s_addr = 0;

    iListenFd = socket(AF_INET, SOCK_STREAM, 0);
    int iRet = bind(iListenFd,(struct sockaddr*) &oBindAddr, sizeof(oBindAddr));
    if (iRet != 0)
    {
		printf("bind error!\n");
		return -1;
    }
    listen(iListenFd, 1024);
   
    clilen = sizeof(oCliAddr);
    iChildren= atoi(argv[2]);
    tChildPid = (pid_t*)malloc( iChildren * sizeof(pid_t));
    cptr = meter(iChildren);

    printf("port=%d, children num=%d\n", oBindAddr.sin_port, iChildren);
    for (int i = 0; i < iChildren; i++)
    {
    	tChildPid[i] = child_make(i, iListenFd, clilen);
    }

    signal(SIGINT, sig_int);
    signal(SIGUSR1, sig_usr1);
    //signal(SIGCHLD, sig_chld);

    for(; ;)
    {
    	pause();
    }
    
}
int
main(int argc, char *argv[])
{
     int listenfd, i;
     socklen_t addrlen;
     void sig_int(int);
     pid_t child_make(int, int,int);
     void my_lock_init(char *);
     void my_lock_wait();
     void my_lock_release();



     

     if (argc == 3) {
          listenfd = Tcp_listen(NULL, argv[1], &addrlen);
     }
     if (argc == 4) {
          listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
          
     }
     if (argc != 3 && argc != 4) {
          err_quit("usage: prefork_server01 [<host>] <port#> <#children>");
     }

     nchildren = atoi(argv[argc-1]);

     pids = Calloc(nchildren, sizeof(pid_t));

     my_lock_init("/tmp/lock.XXXXXX");

     for (i=0 ;i < nchildren ;i++  ) {
          pids[i] = child_make(i, listenfd, addrlen);
          
     }

     Signal(SIGINT, sig_int);

     for ( ;   ;  ) {
          pause();              /* 実際の処理は子プロセスが行う */
          
     }

     return 0;
}
Ejemplo n.º 12
0
void mpm_prefork()
{
    int listenfd,  i;
    char listen[6];
    sprintf(listen,  "%d", config->Listen);
    socklen_t addrlen;
    void sig_int(int);
    pid_t child_make(int, int, int);
    listenfd = Tcp_listen(NULL, listen, &addrlen);
    nchildren = config->StartServers;
    pids = calloc(nchildren, sizeof(pid_t));

    my_lock_init("/tmp/lock.server");
    for (i = 0; i < nchildren; i++)
        pids[i] = child_make(i, listenfd, addrlen);
				Signal(SIGTERM, sig_int);
    for ( ; ; )
        pause();
}
Ejemplo n.º 13
0
int
main(int argc, char **argv)
{
	int			listenfd, i, navail, maxfd, nsel, connfd, rc;
	void		sig_int(int);
	pid_t		child_make(int, int, int);
	ssize_t		n;
	fd_set		rset, masterset;
	socklen_t	addrlen, clilen;
	struct sockaddr	*cliaddr;

	if (argc == 3)
		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
	else if (argc == 4)
		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
	else
		err_quit("usage: serv05 [ <host> ] <port#> <#children>");

	FD_ZERO(&masterset);
	FD_SET(listenfd, &masterset);
	maxfd = listenfd;
	cliaddr = Malloc(addrlen);

	nchildren = atoi(argv[argc-1]);
	navail = nchildren;
	cptr = Calloc(nchildren, sizeof(Child));

		/* 4prefork all the children */
	for (i = 0; i < nchildren; i++) {
		child_make(i, listenfd, addrlen);	/* parent returns */
		FD_SET(cptr[i].child_pipefd, &masterset);
		maxfd = max(maxfd, cptr[i].child_pipefd);
	}

	Signal(SIGINT, sig_int);

	for ( ; ; ) {
		rset = masterset;
		if (navail <= 0)
			FD_CLR(listenfd, &rset);	/* turn off if no available children */
		nsel = Select(maxfd, &rset, NULL, NULL, NULL);

			/* 4check for new connections */
		if (FD_ISSET(listenfd, &rset)) {
			clilen = addrlen;
			connfd = Accept(listenfd, cliaddr, &clilen);

			for (i = 0; i < nchildren; i++)
				if (cptr[i].child_status == 0)
					break;				/* available */

			if (i == nchildren)
				err_quit("no available children");
			cptr[i].child_status = 1;	/* mark child as busy */
			cptr[i].child_count++;
			navail--;

			n = Write_fd(cptr[i].child_pipefd, "", 1, connfd);
			Close(connfd);
			if (--nsel == 0)
				continue;	/* all done with select() results */
		}

			/* 4find any newly-available children */
		for (i = 0; i < nchildren; i++) {
			if (FD_ISSET(cptr[i].child_pipefd, &rset)) {
				if ( (n = Read(cptr[i].child_pipefd, &rc, 1)) == 0)
					err_quit("child %d terminated unexpectedly", i);
				cptr[i].child_status = 0;
				navail++;
				if (--nsel == 0)
					break;	/* all done with select() results */
			}
		}
	}
}
Ejemplo n.º 14
0
int main(int argc, char *argv[]) {
	int sockfd, newsockfd, portno, clilen;
	char buff[256], *ptr;
	struct sockaddr_in serv_addr, cli_addr;
	int n;
	const int on = 1;

	if (argc < 2) {
		fprintf(stderr, "ERROR, no port provided\n");
	}

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd < 0)
		perror("ERROR opening socket");

	//setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
	bzero((char *) &serv_addr, sizeof(serv_addr));
	portno = atoi(argv[1]);
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(portno); /// =htons(atoi(argv[1]));
	//setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

	if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
		perror("ERROR on binding");
		exit(0);
	}

	listen(sockfd, 5);
	int i;
	pids = calloc(START_SERVERS, sizeof(pid_t));
	for (i = 0; i < START_SERVERS; i++) {
		pids[i] = child_make(i, sockfd, sizeof(serv_addr));
	}

	signal(SIGINT, sig_int);

	for (;;) {

		for(i=0;i<START_SERVERS;i++){
			sleep(10);
			int p;
			int sockfd;
			struct sockaddr_un servaddr;

			sockfd = socket(AF_LOCAL, SOCK_STREAM,0);
			bzero(&servaddr, sizeof(servaddr));
			servaddr.sun_family = AF_LOCAL;
			char *unixpath[32];
			sprintf(unixpath,"%d", pids[i]);
			strcpy(servaddr.sun_path, unixpath);

			connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

			n = write(sockfd,"req",3);
			     //if (n < 0)  printf("ERROR writing to socket\n");

		    bzero(buff,256);
			n = read(sockfd,buff,255);
			    //if (n < 0) printf("ERROR reading from socket\n");
			   printf("Number of requests handled :%s\n",buff);
			   close(sockfd);
			   int req = atoi(buff);
			   if(req>=MAX_REQUEST_PER_CHILD){
				   kill(pids[i],SIGTERM);
				   printf("Killed process pid : %ld\n",pids[i]);
				   pids[i] = child_make(i, sockfd, sizeof(serv_addr));
				   sleep(10);
				   printf ("Started process pid: %ld\n",pids[i]);
			   }
		}


		pause();

		}
}
int
main(int argc, char **argv)
{
	int listenfd, n;
	struct sockaddr_in servaddr;
	void sig_chld(int);
	void sig_int(int);
	struct socket_fdinfo si;

	if (argc != 4)
		err_quit("Usage: %s <port> <#children> <#max>", basename(argv[0]));

	listenfd = Socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(atoi(argv[1]));

	Bind(listenfd, (SA *) & servaddr, sizeof(servaddr));

	Listen(listenfd, LISTENQ);

	maxconn = atoi(argv[3]);

	Pch = Calloc(maxconn, sizeof(struct child));
	if ((nchildren = mmap(0, sizeof(int),
			    PROT_READ | PROT_WRITE,
			    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
		err_sys("mmap error");
	if ((Pstat = mmap(0, sizeof(long) * maxconn,
			  PROT_READ | PROT_WRITE,
			  MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
		err_sys("mmap error");
	minconn = *nchildren = atoi(argv[2]);

    if ((lock_fd = open("/tmp/lock.fd", O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0)
        err_sys("open lock_fd error");
    if (unlink("/tmp/lock.fd") < 0)
        err_sys("unlink error");

#if 0
	Signal(SIGCHLD, sig_chld);	/* must call waitpid() */
#endif
	_signal(SIGTERM, sig_term);

	int i, nsel;
	fd_set masterset, rset;
    FD_ZERO(&masterset);
    FD_SET(listenfd, &masterset);

	for (i = 0; i < *nchildren; i++) {
		/* parent prefork children */
		child_make(i, listenfd);
#if (_DEBUG)
        printf("%d status: %d\n", i, Pch[i].child_status);
#endif
	}

	_signal(SIGINT, _sig_int);
	_signal(SIGCHLD, sig_chld);

	for (;;) {
		rset = masterset;
		if ((nsel = select(listenfd+1, &rset, NULL, NULL, NULL)) < 0) {
			if (errno == EINTR)
				continue;
			else
				err_sys("select error");
		} else if (nsel == 0) {	/* _no_ need */
			err_msg("select timeout");
			continue;
		}
		if ((n = proc_pidfdinfo(getpid(), listenfd, PROC_PIDFDSOCKETINFO, &si, sizeof(si))) <= 0)
			err_sys("proc_pidfdinfo error");
        if (n < sizeof(si))
			err_quit("proc_pidfdinfo failed");
        /*
         * struct socket_info {}
         * soi_qlen: half-connction
         * soi_incqlen: incoming-connection
         * soi_rcv.sbi_cc: establish but not delivered connection
         * soi_snd.sbi_cc: send but not delivered connection
         */
        mode_lock_wait(lock_fd);
        if (si.psi.soi_qlen + si.psi.soi_incqlen > 1 &&
                *nchildren < maxconn && quitflag != 1)
#if 0
        if (si.psi.soi_rcv.sbi_cc + si.psi.soi_snd.sbi_cc > 0 &&
                *nchildren < maxconn && !quitflag)
#endif /* On BSD always 0 */
        {
            for (i = 0; i < maxconn; i++) {
                if (Pch[i].child_status == 0)
                    break;
            }
            child_make(i, listenfd);
            (*nchildren)++;
        }
        mode_lock_release(lock_fd);
	}
	exit(0);
}
Ejemplo n.º 16
0
/*
 * Create a pool of children to handle incoming connections
 */
short int child_pool_create (void)
{
        unsigned int i;

        /*
         * Make sure the number of MaxClients is not zero, since this
         * variable determines the size of the array created for children
         * later on.
         */
        if (child_config.maxclients == 0) {
                log_message (LOG_ERR,
                             "child_pool_create: \"MaxClients\" must be "
                             "greater than zero.");
                return -1;
        }
        if (child_config.startservers == 0) {
                log_message (LOG_ERR,
                             "child_pool_create: \"StartServers\" must be "
                             "greater than zero.");
                return -1;
        }

        child_ptr =
            (struct child_s *) calloc_shared_memory (child_config.maxclients,
                                                     sizeof (struct child_s));
        if (!child_ptr) {
                log_message (LOG_ERR,
                             "Could not allocate memory for children.");
                return -1;
        }

        servers_waiting =
            (unsigned int *) malloc_shared_memory (sizeof (unsigned int));
        if (servers_waiting == MAP_FAILED) {
                log_message (LOG_ERR,
                             "Could not allocate memory for child counting.");
                return -1;
        }
        *servers_waiting = 0;

        /*
         * Create a "locking" file for use around the servers_waiting
         * variable.
         */
        _child_lock_init ();

        if (child_config.startservers > child_config.maxclients) {
                log_message (LOG_WARNING,
                             "Can not start more than \"MaxClients\" servers. "
                             "Starting %u servers instead.",
                             child_config.maxclients);
                child_config.startservers = child_config.maxclients;
        }

        for (i = 0; i != child_config.maxclients; i++) {
                child_ptr[i].status = T_EMPTY;
                child_ptr[i].connects = 0;
        }

        for (i = 0; i != child_config.startservers; i++) {
                DEBUG2 ("Trying to create child %d of %d", i + 1,
                        child_config.startservers);
                child_ptr[i].status = T_WAITING;
                child_ptr[i].tid = child_make (&child_ptr[i]);

                if (child_ptr[i].tid < 0) {
                        log_message (LOG_WARNING,
                                     "Could not create child number %d of %d",
                                     i, child_config.startservers);
                        return -1;
                } else {
                        log_message (LOG_INFO,
                                     "Creating child number %d of %d ...",
                                     i + 1, child_config.startservers);

                        SERVER_INC ();
                }
        }

        log_message (LOG_INFO, "Finished creating all children.");

        return 0;
}
Ejemplo n.º 17
0
/*
 * Keep the proper number of servers running. This is the birth of the
 * servers. It monitors this at least once a second.
 */
void child_main_loop (void)
{
        unsigned int i;

        while (1) {
                if (config.quit)
                        return;

                /* If there are not enough spare servers, create more */
                SERVER_COUNT_LOCK ();
                if (*servers_waiting < child_config.minspareservers) {
                        log_message (LOG_NOTICE,
                                     "Waiting servers (%d) is less than MinSpareServers (%d). "
                                     "Creating new child.",
                                     *servers_waiting,
                                     child_config.minspareservers);

                        SERVER_COUNT_UNLOCK ();

                        for (i = 0; i != child_config.maxclients; i++) {
                                if (child_ptr[i].status == T_EMPTY) {
                                        child_ptr[i].status = T_WAITING;
                                        child_ptr[i].tid =
                                            child_make (&child_ptr[i]);
                                        if (child_ptr[i].tid < 0) {
                                                log_message (LOG_NOTICE,
                                                             "Could not create child");

                                                child_ptr[i].status = T_EMPTY;
                                                break;
                                        }

                                        SERVER_INC ();

                                        break;
                                }
                        }
                } else {
                        SERVER_COUNT_UNLOCK ();
                }

                sleep (5);

                /* Handle log rotation if it was requested */
                if (received_sighup) {
                        /*
                         * Ignore the return value of reload_config for now.
                         * This should actually be handled somehow...
                         */
                        reload_config ();

#ifdef FILTER_ENABLE
                        filter_reload ();
#endif /* FILTER_ENABLE */

                        /* propagate filter reload to all children */
                        child_kill_children (SIGHUP);

                        received_sighup = FALSE;
                }
        }
}
Ejemplo n.º 18
0
int main(int argc, char* argv[])
{
	int 	listenfd, i, navail, maxfd, nsel, connfd, rc;
	void	sig_int(int);
	pid_t	child_make(int,int,int);
	ssize_t n;
	fd_set 	rset, masterset;
	socklen_t addrlen,clilen;
	struct sockaddr* cliaddr;

	listenfd = Tcp_listen(argv[1], argv[2], &addrlen);

	FD_ZERO(&masterset);
	FD_SET(listenfd, &masterset);
	maxfd = listenfd;
	cliaddr = Malloc(addrlen);
	nchildren = atoi(argv[argc - 1]);
	navail = nchildren;
	cptr = Calloc(nchildren, sizeof(Child));
	for (i = 0; i < nchildren; ++i)
	{
		child_make(i, listenfd, addrlen);
		FD_SET(cptr[i].child_pipefd, &masterset);
		maxfd = max(maxfd, cptr[i].child_pipefd);
	}
	Signal(SIGINT, sig_int);
	for(;;){
		rset = masterset ;
		if(navail <= 0)
			FD_CLR(listenfd, &rset);
		nsel = Select(maxfd+1, &rset, NULL, NULL, NULL);
		if(FD_ISSET(listenfd, &rset)){
			clilen = addrlen;
			connfd = Accept(listenfd, cliaddr, &clilen);
			for (i = 0; i < nchildren; ++i)
			{
				if(cptr[i].child_status == 0)
					break;
			}
			if(i == nchildren)
				err_quit("no available children");
			cptr[i].child_status = 1;
			cptr[i].child_count++;
			navail--;

			n = Write_fd(cptr[i].child_pipefd, "", 1, connfd);
			Close(connfd);
			if(--nsel==0) continue;
		}

		for(i = 0; i <nchildren ;++i){
			if(FD_ISSET(cptr[i].child_pipefd, &rset)){
				if((n = Read(cptr[i].child_pipefd, &rc, 1)) == 0){
					err_quit("child %d terminated unexpectd",i);
				}
				cptr[i].child_status = 0;
				navail++;
				if(--nsel ==0)break;
			}
		}
	}
}