Я написал многопоточный TCP-сервер, используя вызов fpFork()
. Работает нормально, но после отключения клиента остается зомби-процесс. Существует бесконечный цикл, в котором я жду входящего соединения, разветвляюсь, передаю это соединение дочернему элементу, который позаботится о нем, а затем выходит. Однако ребенок остается зомби до тех пор, пока родитель не прекратит работу.
while True do
begin
// Accept connection
ClientAddrLen := sizeof(ClientAddr);
ClientSock := fpaccept(ServerSock, @ClientAddr, @ClientAddrLen);
if ClientSock > 0 then // Success?
begin
Pid := fpFork();
// Error fork
if pid < 0 then
begin
CloseSocket(ClientSock);
continue;
end
// Child process
else if pid = 0 then
begin
CloseSocket(ServerSock);
handleClient(ClientSock);
CloseSocket(ClientSock);
Halt(0);
end
// parent process
else if pid > 0 then
begin
CloseSocket(ClientSock);
continue;
end;
end;
end;
Я пишу о функции fpWait()
или fpWaitPid()
, но в документации по свободному паскалю отсутствуют примеры, и гуглить это бесполезно, поэтому я даже не знаю, как ее использовать. Я использую fpc 2.6.4 на FreeBSD.
Обновление 1 После проб и ошибок, чтения руководств и обсуждений я попробовал несколько комбинаций. Я помещаю следующие функции в родительскую часть исполняемого кода:
else if pid > 0 then
begin
CloseSocket(ClientSock);
//here
continue;
end;
а) Использование WaitProcess(pid)
(эквивалентно fpWaitPid(pid, @Status, 0)
)
С этим родительским процессом ждите дочернего процесса, однако, поскольку родительский процесс ждал, он не мог принять другое соединение, пока дочерний процесс не будет завершен.
б) Использование fpWaitPid(pid, @Status, WNOHANG)
Эта функция не блокирует программу, но и ничего делать не мешает. Вроде и функции нет. Это сбивает с толку, потому что везде, где я читал об этом (это было закодировано на C, но это не имеет значения, эти функции являются только оболочками для вызовов unix), предлагалось использовать это.
На данный момент я понятия не имею, что может быть не так. Заранее спасибо.