Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Igor Sysoev                          2:5020/400     22 Feb 2002  07:06:20
 To : Oleg Yurchenco
 Subject : Re: fork() + socket
 -------------------------------------------------------------------------------- 
 
 Oleg Yurchenco <olegy@diawest.net.ua> wrote:
 
 > Hабрал примерчик клиента и сервера из книжки Кейта Хевиленда.
 > Все работает Ок.
 > В сервере каждое новое соединение обслуживается ч\з fork():
 > ~~~~~~~~~~~~~~~~~~~~~
 > for(;;)
 >   {
 >   if( (newsockfd = accept(sockfd,NULL,NULL)) == -1)
 >     {
 >     perror("accept error");
 >     continue;
 >     }
 > 
 >   if(fork() == 0)
 >     {
 >     printf("new connection %d\n",newsockfd);
 >     while(recv(newsockfd,&c,1,0) > 0)
 > ~~~~~~~~~~~~~~~~~~~~~~~~~
 > Возникло два вопроса:
 > 1) Обнаружил странное явление:
 > пока работет server (srv.e) после каждого соединения в списке процессов 
 > остается лишняя строка ,хотя я вижу что дочерний процесс завершается (выдаю 
 > сообщение)  
 > 
 >   F S   UID   PID  PPID  C PRI  NI ADDR    SZ WCHAN  TTY          TIME CMD
 > 100 S   501  1014   949  0  69   0    -   676 wait4  tty1     00:00:00 bash
 > 000 S   501  2596  2161  0  75   0    -   682 wait4  tty1     00:00:00 bash
 > 000 S   501  2612  2596  0  69   0    -   328 wait_f tty1     00:00:00 
 > serv.e
 > 044 Z   501  2613  2612  0  69   0    -     0 do_exi tty1     00:00:00 
 > serv.e <d
 > 044 Z   501  2614  2612  0  69   0    -     0 do_exi tty1     00:00:00 
 > serv.e <d
 > 044 Z   501  2615  2612  0  69   0    -     0 do_exi tty1     00:00:00 
 > serv.e <d
 > 044 Z   501  2616  2612  0  69   0    -     0 do_exi tty1     00:00:00 
 > serv.e <d
 > 044 Z   501  2617  2612  0  69   0    -     0 do_exi tty1     00:00:00 
 > serv.e <d
 > 000 R   501  2620  2596  0  79   0    -   789 -      tty1     00:00:00 ps
 
 <defunc> - это зомби. Их нужно wait()ить основным процессом в цикле
 или в обработчике SIGCHLD.
 
 > 2) После очередного убивания серверной программы (там нет штатного выхода) 
 > она перестала запускаться:
 > "bind error: Address already in use"
 > В списке процессов её нет. Т.е. получается, что порт который я использовал 
 > остался занят до следующей перезагрузки? Hеужели ОС не освобождает ресурсы 
 > при завершении процесса?
 
 Перед bind нужно сделать:
 
 int reuseaddr = 1;
 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
                (const void *) &reuseaddr, sizeof(reuseaddr)) == -1)
     perror("error");
 
 SO_REUSEADDR решает несколько проблем, в том числе и эту.
 
 -- 
 Игорь Сысоев
 
 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
 --- ifmail v.2.15dev5
  * Origin: Talk.Mail.Ru (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 fork() + socket   Oleg Yurchenco   21 Feb 2002 10:10:12 
 Re: fork() + socket   Oleg O. Ossovitskii   21 Feb 2002 11:36:57 
 Re: fork() + socket   Aleksey Demidov   21 Feb 2002 11:49:24 
 Re: fork() + socket   Igor Sysoev   22 Feb 2002 07:06:20 
Архивное /ru.linux/6488cf016876.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional