The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"fork() и после завершения дочернего процесса он становится з..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"fork() и после завершения дочернего процесса он становится з..."
Сообщение от Dima emailИскать по авторуВ закладки on 17-Авг-02, 22:58  (MSK)
Всем привет!

Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
Клиент соединяется с сервером по 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);
}

Спасибо!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: fork() и после завершения дочернего процесса он становит..."
Сообщение от Аноним emailИскать по авторуВ закладки on 18-Авг-02, 00:04  (MSK)
>Всем привет!
>
>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>
>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>его переводит в верхний регистр и возвращает клиенту.
>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>процесс становится зомби...
>Как можно этого избежать?

Родительский процесс должен сказать wait.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: fork() и после завершения дочернего процесса он становит..."
Сообщение от Dima emailИскать по авторуВ закладки on 18-Авг-02, 01:05  (MSK)
>>Всем привет!
>>
>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>
>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>его переводит в верхний регистр и возвращает клиенту.
>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>процесс становится зомби...
>>Как можно этого избежать?
>
>Родительский процесс должен сказать wait.

Родительский процесс в этом случае тогда будет приостановлен и не будет принимать новые подключения, пока не дождётся завершения первого.
Или нет?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: fork() и после завершения дочернего процесса он становит..."
Сообщение от Аноним emailИскать по авторуВ закладки on 18-Авг-02, 04:10  (MSK)
>>>Всем привет!
>>>
>>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>>
>>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>>его переводит в верхний регистр и возвращает клиенту.
>>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>>процесс становится зомби...
>>>Как можно этого избежать?
>>
>>Родительский процесс должен сказать wait.
>
>Родительский процесс в этом случае тогда будет приостановлен и не будет принимать
>новые подключения, пока не дождётся завершения первого.

Для полного счастья, установите handler для SIGCHLD, и по поступлении
оного вызываете wait; здесь есть тонкость, т.к. если два потомка
завершатся, пока родитель спит, родителю будет доставлен только один
сигнал. Поэтому желательно вызывать waitpid(-1, WNOHANG) в цикле, до
тех пор, пока waitpid рапортует успех.

>Или нет?


  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: fork() и после завершения дочернего процесса он становит..."
Сообщение от Dima Искать по авторуВ закладки on 18-Авг-02, 19:20  (MSK)
>>>>Всем привет!
>>>>
>>>>Вот такая проблема, сделал простейшую клиент/сервер программу (точнее две, клиент и сервер)
>>>>
>>>>Клиент соединяется с сервером по tcp и передаёт ему один символ, тот
>>>>его переводит в верхний регистр и возвращает клиенту.
>>>>Проблема в том, когда клиент отсоединяется от сервера, то пораждённый второй серверный
>>>>процесс становится зомби...
>>>>Как можно этого избежать?
>>>
>>>Родительский процесс должен сказать wait.
>>
>>Родительский процесс в этом случае тогда будет приостановлен и не будет принимать
>>новые подключения, пока не дождётся завершения первого.
>
>Для полного счастья, установите handler для SIGCHLD, и по поступлении
>оного вызываете wait; здесь есть тонкость, т.к. если два потомка
>завершатся, пока родитель спит, родителю будет доставлен только один
>сигнал. Поэтому желательно вызывать waitpid(-1, WNOHANG) в цикле, до
>тех пор, пока waitpid рапортует успех.
>
>>Или нет?

Спасибо! Помогло!

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру