![]() |
|
Модераторы: feodorv |
![]()
|
|
| Alexey91 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Здравствуйте!!
Уже второй раз за день обращаюсь к форуму. К счастью или к сожалению, не вижу других форумов по сокетам (обратился бы туда, дабы не надоедать). У меня два вопроса: 1. По коду где используется функция fork(). Зачем в ветки 'case 0' после создания дочернего процесса сразу же выполняется функция close(listener); - закрытие слушающего сокета? 2. Функция fork() создает дочерний процесс. Если смотреть википедию, то создается копия родительского процесса. Если читать маны, то написано создается копия сервера. А сервер в данном случае это что? Процесс, который использует исполняемый код сервера?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
потому что если fork() возвращает 0 - значит текущий процесс является процессом ребенком. и, следовательно, выполнять accept() не задача детей, а задача родителя.
так же, из доки ты можешь узнать, что при форке - ребенок наследует дескрипторы от родителя. |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Листинг 2.12 UNIX TCP-сервер
Для читателя, не знакомого с тонкостями программирования для UNIX-систем, дадим некоторые пояснения к приведенному тексту программы. Единственным способом создания процесса в системе UNIX является использование системного вызова fork(). Функционально, новый (порожденный, child) процесс создается посредством копирования выполняемого (родительского, parent) процесса. Порожденный процесс-потомок наследует большую часть атрибутов своего родителя, и в частности, открытые файлы (порожденный процесс обладает копией дескрипторов файлов, открытых его родителем). Особый процесс init является общим предком по отношению ко всем остальным. Он инициализирует совокупность администраторов системы (демонов) и связывает процесс с каждым терминалом. Системный вызов exec() позволяет запустить выполнение новой программы в рамках текущего процесса. Порождающий процесс может быть синхронизирован с порожденными благодаря функции wait(). Последние сигнализируют о своем окончании посредством обращения exit(). Если порожденный процесс заканчивается раньше своего родителя, обработка данных производится следующим образом: - если процесс-родитель находился в состоянии ожидания, обеспеченного функцией wait(), он выходит из этого состояния; - если родителем не была задействована функция типа wait(), порожденный процесс остается в состоянии "зомби", т.е. он возвращает все ресурсы, приданные ему системой, но сохраняет свое местонахождение в таблице процессов до подачи сигнала о его окончании. - Если порождающий процесс закончился раньше своих преемников, приемным родителем последних становится процесс init(). Главное теперь – понять, что после выполнения вызова fork() у нас "одновременно" работают 2 процесса, и первой командой родительской программы будет инструкция close(newsd), которую родитель, скорее всего, начнет выполнять гораздо раньше, чем потомок передаст данные клиенту. Затем родитель исполняет функцию while (waitpid (-1, NULL, WNOHANG) > 0); Возвращаемое значение этой функции – идентификатор завершенного процесса-потомка. Назначение этой инструкции – дождаться завершения потомка и не дать ему превратиться в зомби. Это можно сделать и при помощи системного вызова wait(), однако вызов waitpid() предпочтительней и вот почему. Во-первых, первым параметром можно задать конкретный идентификатор процесса pid. В данном случае это не делается, но первым параметром со значением –1 указывается, что нужно дождаться завершения первого дочернего процесса. Второе важное обстоятельство – это параметр WNOHANG. Этим параметром ядро оповещается, что не нужно блокироваться (ждать) в функции waitpid(), если у родителя на момент исполнения этой функции не будет ни одного завершенного процесса-потомка. В тоже время функция wait() блокирует исполнение родителя до появления первого завершенного процесса-потомка и возвращает его pid. Второй параметр - NULL – указывает, что статусная информация о процессе-потомке нас не интересует. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |