|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Oleg Yurchenco 2:5020/400 21 Feb 2002 10:10:12 To : All Subject : fork() + socket --------------------------------------------------------------------------------
Плз. помогите чайнику.
Разбираюсь с программированием socket в линуксе.
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
2) После очередного убивания серверной программы (там нет штатного выхода)
она перестала запускаться:
"bind error: Address already in use"
В списке процессов её нет. Т.е. получается, что порт который я использовал
остался занят до следующей перезагрузки? Hеужели ОС не освобождает ресурсы
при завершении процесса?
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/65778deae41c.html, оценка из 5, голосов 10
|