|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/6488cf016876.html, оценка из 5, голосов 10
|