Как мне отличить Ctrl + C от обычной отмены привязки с помощью EventMachine? - PullRequest
3 голосов
/ 27 декабря 2011

Есть ли хороший способ различать, когда я нажимаю Ctrl + C, чтобы вручную закрыть все соединения, и когда клиент отключается от моего сервера? Кажется, они оба вызывают метод unbind.

Когда я вручную выключаюсь с помощью Ctrl + C, я, вероятно, могу попытаться восстановить соединение с узлами, к которым я подключен, при запуске резервного копирования, потому что они все еще в сети. Если клиент отключается от меня, я не хочу пытаться повторно подключиться к нему какое-то время, потому что он, вероятно, выключен, даже если я все еще в сети.

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Мне удалось получить ответ из группы Google EventMachine.

http://groups.google.com/group/eventmachine/browse_thread/thread/92d92d7d101e933c

В основном вы можете использовать EM.next_tick для запуска дополнительных вещей, которые вы не захотите делать на Ctrl-C (поскольку реактор выключается и следующего тика нет).

Вот мой метод отмены привязки:

  def unbind
    # temporarily disconnect in a way that would reconnect next time
    @peer.update_attribute :connected, false

    # really disconnect, this is not called on ctrl-c
    EM.next_tick do
      @peer.destroy
    end
  end
1 голос
/ 27 декабря 2011

CTRL + C является сигналом для запущенного процесса, вы можете заманивать его в ловушку, и он будет выглядеть так:

interrupted = false

trap("INT") { interrupted = true }


if interrupted
   # CTRL+C pressed
end
# rest of program

Подобным образом вы можете перехватывать больше сигналов, таких как HUP или KILL

...