У меня есть этот проект сервера, который развивает новые дети после нового клиентского соединения. Тогда в зависимости от клиентской команды дочерний сервер выполняет некоторую работу внутри обработчика функции (соединения).Родительский серверный вилок должен своевременно покидать
В то же время я хочу остановить родительский сервер, и до этого пусть родитель ждет всех работающих детей.
Вопрос в том, где я должен поместить эту сигнальную функцию для опции прерывания клавиатуры Ctrl + C. signal.signal (signal.SIGINT, signal_handler)
Спасибо ребята за помощь симпатичную и почти смарт-самку. :)
children_list = []
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.bind((HOST, PORT))
conn.listen(5)
print("Listening on TCP port %s" % PORT)
def reaper(pids):
while children_list:
pid,stat = os.waitpid(0, os.WNOHANG)
if not pid:
break
pids.remove(pid)
def handler(connection):
cmd = connection.recv(socksize)
def signal_handler(signal, frame):
print 'You pressed Ctrl+C!'
sys.exit(0)
def accept():
while 1:
global connection
connection, address = conn.accept()
print "welcome new client!"
reaper(children_list)
pid = os.fork()
if pid:#parent
children_list.append(pid)
connection.close()
else:#child
handler(connection)
accept()
Это действительно поможет исправить отступы, чтобы это было доступно для чтения и запуска. Как бы то ни было, я могу _guess_, что он делает, но было бы лучше, если бы мне не пришлось. – abarnert
И как примечание, какая-то конкретная причина, по которой вы используете 'fork' вместо' threading'? Есть много веских причин (например, если дети не похожи на типичных обработчиков серверов, которые в основном ждут ввода-вывода, но им нужно много работы с ЦП ... или если вы хотите отделить их, чтобы вы могли отключить акцептор, но оставить существующих клиентов, работающих ... и т. д.), но мне любопытно, в чем причина. – abarnert
И последнее примечание: сервер TCP обычно хочет вызвать 'conn.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)' перед вызовом 'bind'. (См. [Здесь] (http://www.unixguide.net/network/socketfaq/4.5.shtml) для древних часто задаваемых вопросов и [здесь] (http://hea-www.harvard.edu/~fine/Tech /addrinuse.html) для получения более подробной информации.) – abarnert