Шрифт:
Мы предполагаем, что функция
В разделе 2.6 мы сказали, что вызов функции
Рассмотрим пример, иллюстрирующий листинг 4.3. Прежде всего, на рис. 4.5 показано состояние клиента и сервера в тот момент, когда сервер блокируется при вызове функции accept и от клиента приходит запрос на соединение.
Рис. 4.5. Состояние соединения клиент-сервер перед завершением вызванной функции accept
Сразу же после завершения функции
Рис. 4.6. Состояние соединения клиент-сервер после завершения функции accept
Следующим действием параллельного сервера является вызов функции
Рис. 4.7. Состояние соединения клиент-сервер после вызова функции fork
Обратите внимание, что оба дескриптора
Далее родительский процесс закрывает присоединенный сокет, а дочерний процесс закрывает прослушиваемый сокет. Это показано на рис. 4.8.
Рис. 4.8. Состояние соединения клиент-сервер после закрытия родительским и дочерним процессами соответствующих сокетов
Это и есть требуемое конечное состояние сокетов. Дочерний процесс управляет соединением с клиентом, а родительский процесс может снова вызвать функцию
4.9. Функция close
Обычная функция Unix
По умолчанию функция
В разделе 7.5 рассказывается о параметре сокета
Счетчик ссылок дескриптора
В конце раздела 4.8 мы отметили, что когда родительский процесс на нашем параллельном сервере закрывает присоединенный сокет с помощью функции
Если мы хотим отправить сегмент FIN по соединению TCP, вместо функции
Необходимо также знать, что происходит с нашим параллельным сервером, если родительский процесс не вызывает функцию