Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2011 03:27:29

xtesterx
От:
Зарегистрирован: 2011-10-20
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Послать сигнал процессу в Windows

Приветствую, собственно перепробовал уже все возможные и приемлемые в данном случае варианты, больше ничего не могу придумать, прошу помощи. Задача следующая: у меня есть pid подпроцесса (его создаю сам, новый процесс наследует от multiprocessing и создаётся обычным способом через метод start), нужно послать этому подпроцессу сигнал, либо что-то ещё, что бы тот прервался по получению этого сигнала, выполнил действия в обработчике этого сигнала, и дальше продолжил работать.
Проблема в том, что в данном случае, возможности использовать какие-либо объекты синхронизации (очереди, пайпы и т.д.) и передавать их в момент создания подпроцесса нельзя (просто нельзя, в силу некоторых требований, от меня не зависящих), и единственное, чем я могу располагать - это pid пораждённого подпроцесса, и зная какой, нужно каким-то образом сообщить подпроцессу, что тот должен выполнить некоторое действие, указанное в обработчике.

Далее, в мануале сказано, что в случае реализации метода os.kill для винды, любые сигналы, кроме signal.CTRL_C_EVENT и signal.CTRL_BREAK_EVENT будут приводить к моментальному вызовы winapi-шной TerminateProcess, без какого-либо вызова обработчика и проче (то есть, просто и сразу убивать подпроцесс), однако же, эти вин-специфические коды (в случае которых, процесс убиваться не будет), нельзя использовать в задании обработчика для этих сигналов, то есть, если в главной программе, сделать:

os.kill(pid, signal.CTRL_C_EVENT)
то не получится связать этот сигнал с обработчиком в порождённом подпроцессе, так как попытка такой связки (то есть попробовать связать обработчик с сигналом в “коде подпроцесса”):
def handle(signum, frame):
print("I have signal with num = {0}!!!!!".format(signum))

signal.signal(signal.CTRL_C_EVENT, handle)
приведёт к вылету интерпретатора с ошибкой:

signal.signal(signal.CTRL_C_EVENT, handle)
ValueError: invalid signal value


То есть, эти “виндовс-спесифик” сигналы можно использовать только в os.kill, но не в задании обработчка - signal.signal о_0

Собственно, подскажите пожалуйста, имеется ли какой-либо способ уведомить пораждённый подпроцесс (то есть, уже созданный ранее) о каком-либо событии, имея только его PID, без использования каких-либо других объектов синхронизации??



Отредактировано (Ноя. 2, 2011 03:31:39)

Офлайн

#2 Ноя. 2, 2011 07:07:16

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Послать сигнал процессу в Windows

В win-системах нет такого понятия как сигналы. Если нужно передавать данные от одного процесса другому можно воспользоваться сокетами или pipe'ами.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version