Всем привет!Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
Клиент соединяется с сервером по tcp и передаёт ему один символ, тот его переводит в верхний регистр и возвращает клиенту.
Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный процесс становится зомби...
Как можно этого избежать?Вот часть кода:
main()
...
socket(AF_INET,.....);
...
bind(...);
...
listen(...);
...
for (;;)
{
accept(...);
...
if ( fork() == 0 )
{
while( recv(newsockfd, &c, 1, 0) > 0 )
{
c = toupper(c);
if ( c == 'Q' ) break;
send(newsockfd, &c, 1, 0);
}
close(newsockfd);
exit(0);
}
close(newsockfd);
}Спасибо!
>Всем привет!
>
>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>
>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>его переводит в верхний регистр и возвращает клиенту.
>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>процесс становится зомби...
>Как можно этого избежать?Родительский процесс должен сказать wait.
>>Всем привет!
>>
>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>
>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>его переводит в верхний регистр и возвращает клиенту.
>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>процесс становится зомби...
>>Как можно этого избежать?
>
>Родительский процесс должен сказать wait.Родительский процесс в этом случае тогда будет приостановлен и не будет принимать новые подключения, пока не дождётся завершения первого.
Или нет?
>>>Всем привет!
>>>
>>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>>
>>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>>его переводит в верхний регистр и возвращает клиенту.
>>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>>процесс становится зомби...
>>>Как можно этого избежать?
>>
>>Родительский процесс должен сказать wait.
>
>Родительский процесс в этом случае тогда будет приостановлен и не будет принимать
>новые подключения, пока не дождётся завершения первого.Для полного счастья, установите handler для SIGCHLD, и по поступлении
оного вызываете wait; здесь есть тонкость, т.к. если два потомка
завершатся, пока родитель спит, родителю будет доставлен только один
сигнал. Поэтому желательно вызывать waitpid(-1, WNOHANG) в цикле, до
тех пор, пока waitpid рапортует успех.>Или нет?
>>>>Всем привет!
>>>>
>>>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>>>
>>>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>>>его переводит в верхний регистр и возвращает клиенту.
>>>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>>>процесс становится зомби...
>>>>Как можно этого избежать?
>>>
>>>Родительский процесс должен сказать wait.
>>
>>Родительский процесс в этом случае тогда будет приостановлен и не будет принимать
>>новые подключения, пока не дождётся завершения первого.
>
>Для полного счастья, установите handler для SIGCHLD, и по поступлении
>оного вызываете wait; здесь есть тонкость, т.к. если два потомка
>завершатся, пока родитель спит, родителю будет доставлен только один
>сигнал. Поэтому желательно вызывать waitpid(-1, WNOHANG) в цикле, до
>тех пор, пока waitpid рапортует успех.
>
>>Или нет?Спасибо! Помогло!