fork () - закрытие сервера - PullRequest
       9

fork () - закрытие сервера

0 голосов
/ 05 октября 2011

Я написал серверную программу, которая может обрабатывать несколько клиентов с помощью fork ().У меня есть обработчик сигнала, проверка ошибок, где это необходимо, и все работает правильно.Он настроен так, что если клиент вводит «quit», сервер должен прекратить принимать соединения, позволить открытым клиентам завершить общение и закрыть, как только все клиенты будут закрыты.Чтобы сделать это, всякий раз, когда вводится 'quit', у меня есть флаг int, который устанавливается в 0. Поскольку переменные в каждом дочернем процессе предназначены только для этого процесса и не влияют на другие дочерние процессы или родительский процесс, я могуне отслеживать, когда флаг установлен в 0. В моем обработчике сигналов я проверяю

    if( count == 0 && flag == 0)
    //close server and exit program

count - это количество открытых клиентов, которое после того, как они все закрыты, очевидно, будет равно нулю (это былоошибка проверена, чтобы убедиться, что это правильно).Кто-нибудь знает, как я могу создать флаг, который может быть установлен внутри одного клиента, и иметь то же значение для каждого клиента?Если это имеет смысл .. Я, кстати, кодирую на C.

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

Дочерний процесс, получающий команду quit, должен отправить сигнал (например, SIGUSR1 - я не рекомендую SIGTERM для этой цели, если вы не собираетесь закрывать все клиенты, как тольковозможно) его родителю, и пусть родитель установит флаг в его пространстве памяти в этом обработчике сигналов.(Родитель может сообщить каждому свой pid, просто сохранив где-нибудь результаты getpid().)

0 голосов
/ 05 октября 2011

Есть много механизмов IPC, которые могут сделать это ... в частности, на ум приходят семафоры.Вы можете создать набор из двух семафоров и использовать один для подсчета количества детей и один для флага выхода.Когда вы запустите вашу программу, счетчик клиентов будет обнулен, а флаг выхода - 1.Когда каждый дочерний элемент запускается, он должен добавить один к числу клиентов ... и вычесть один, когда выйдет.Когда клиент получает команду выхода, он обнуляет флаг выхода.Основная программа будет знать, когда все будет сделано, когда оба семафора достигнут нуля.

Или (если возможно) вы можете просто запустить потоки вместо разветвления процессов и использовать два глобальных int s для count и flag и глобальный мьютекс для их защиты.API-интерфейс pthreads довольно прост в использовании для простых вещей, в которых не требуется много связи между потоками, а создание потока выполняется быстрее, чем fork + exec.

0 голосов
/ 05 октября 2011

Вам нужно внедрить единый сервер, чтобы все могли общаться с ним, он будет рассылать сообщения всем клиентам, чтобы обновить их счетчиком клиентов, но, по сути, без особых сложностей говорить и отслеживать всех других клиентов. это немного сложно.

Это также будет место для маршрутизации и трафика сообщений между различными клиентами.

Надеюсь, это светит немного.

...