Я не на 100% уверен в том, что вы пытаетесь сделать, покупая мне на макушку, я бы предпочел сделать форк после принятия, и просто выйти (), когда вы ' сделано. Имейте в виду, однако, что вам нужно реагировать на сигнал SIGCHLD при выходе из дочернего процесса, иначе у вас будет куча зомби-процессов, ожидающих передачи своего состояния выхода родительскому процессу. C-псевдо-код:
for (;;) {
connecting_socket = accept(server_socket);
if (connecting_socket < 0)
{
if (errno == EINTR)
continue;
else
{
// handle error
break;
}
}
if (! (child_pid = fork ()))
{
// child process, do work with connecting socket
exit (0);
}
else if (child_pid > 0)
{
// parent process, keep track of child_pid if necessary.
}
else
{
// fork failed, unable to service request, send 503 or equivalent.
}
}
child_pid необходим (как уже упоминалось) для уничтожения дочернего процесса, а также, если вы хотите использовать waitpid для получения статуса выхода.
Что касается зомби-процессов, если вы не заинтересованы в том, что случилось с процессом, вы можете установить механизм обработки сигналов для SIGCHLD и просто зациклить на waitpid с -1, пока не останется дочерних процессов, как это
while (-1 != waitpid (-1, NULL, WNOHANG))
/* no loop body */ ;
Функция waitpid будет возвращать pid вышедшего потомка, поэтому, если вы хотите, вы можете соотнести это с некоторой другой информацией о соединении (если вы отслеживали pid). Имейте в виду, что accept, вероятно, завершится с errno, установленным в EINTR, без действительного соединения, если перехвачен SIGCHLD, поэтому не забудьте проверить это при приеме return.
EDIT:
Не забудьте проверить наличие ошибок, т. Е. Fork возвращает -1.