Как оказалось, в этом сценарии проще всего обеспечить подключение к серверу, ветвление и создание дочернего процесса, а также передачу каждым процессом данных по сети, а сложнее всего — синхронизировать клиентский и серверный процессы, чтобы они корректно завершали свою работу по окончании сеанса. В ином случае имеется вероятность того, что один процесс будет продолжать работать после завершения другого.
Разрыв соединения может происходить по двум сценариям. В первом случае этот процесс инициализирует удаленный сервер, закрывая свой конец сокета. Здесь дочерний процесс получает сообщение о возникновении условия EOF при следующей попытке чтения с сервера, и вызывает функцию exit(). Он каким-то образом должен сообщить родительскому процессу о том, что прекращает свою работу. Во втором случае пользователь закрывает стандартное устройство ввода. Родительский процесс обнаруживает условие EOF при чтении из устройства STDIN и должен сообщить дочернему процессу, что сеанс окончен.
В системах UNIX предусмотрен встроенный механизм, позволяющий дочерним процессам сообщать родительским процессам о том, что они прекращают свою работу. Родительскому процессу автоматически передается сигнал CHLD при завершении работы каждого из его подпроцессов, а также в случае приостановки или возобновлении работы подпроцесса. Чтобы родительский процесс мог обнаружить закрытие соединения удаленным сервером, в нем достаточно установить обработчик сигнала CHLD, который вызывает функцию exit(). Когда дочерний процесс обнаружит, что сервер закрыл соединение, он может завершить работу и выработать сигнал CHLD. Вызывается обработчик сигнала родительского объекта и выполняется также выход из этого процесса.
2013-11-20 10:10:49
это интересно Быть в курсе последних новостей – последнее время это наш ритм жизни. Информационная осведомленность уже давно является залогом нашего успеха. Лучший способ следить за последними новостями это специальные рассылки, например, http://www.mailinfo.ru, которая не только многогранна, но и позволит узнавать новости первыми.