Quoting Shao Zhang ([EMAIL PROTECTED]):
> 
>       while (1) {
>               if ((NewHandle = accept(CGIHandle, (struct sockaddr 
> *)&CGI_addr, \
>               &sin_size)) == -1) {
>                       perror("cannot accept");
>                       continue;
>               }
> 
>                       if (!fork() ) { /* this is the child */
>                       /* process the cgi request; */
> 
>                       close(NewHandle);
>                       exit(0);
>               }
> 
>               close(NewHandle); /* parent does not need this */
>       }
> 
>       My problem is I have to close the NewHandle for the parent process.
>       But once I did this, when another request comes
>       in, accept will allocate a new file descriptor with the same number it
>       allocated before, since it is thinking the last one is closed.
>       If the last child process still has not finished, then I will have two
>       child process with the same descriptor, and then the child
>       will return the request to the wrong location.

You've answered this yourself. "a new file descriptor with the same number".
So you have, for example, file descriptors p(arent)-n(umber) which becomes
p-n=c(hild)1-n at the fork. p-n is then closed, leaving c1-n. Now the second
request leads to p-n again, which becomes p-n=c2-n, and p-n gets closed.
At any one time, there exist: p-n=cc-n .. c2-n c1-n and they're all
unique except the first pair. n is the same in all cases, but they're in
different processes, and so distinguishable.

Cheers,

-- 
Email:  [EMAIL PROTECTED]   Tel: +44 1908 653 739  Fax: +44 1908 655 151
Snail:  David Wright, Earth Science Dept., Milton Keynes, England, MK7 6AA
Disclaimer:   These addresses are only for reaching me, and do not signify
official stationery. Views expressed here are either my own or plagiarised.

Reply via email to