Выделение указателя ip
приведет к возврату того, что происходит в это место памяти в это время.
Он возвращает 0, потому что это то, что четыре байта в ip
происходят при кодировании в качестве целого.
разыменование указателя после его удаления непредсказуемо. Это может быть ноль, это может быть что-то другое, если эта память была перераспределена в другом месте.
Вам просто повезло, что при запуске вашей программы это 0.
Можно использовать atexit для этого и регистр, любой очищает задачи, которые будут выполнены, когда программа выходит.
atexit.register (func [*args [** kargs]])
В Вашем процессе очистки, можно также реализовать собственное ожидание и уничтожить его, когда желаемый тайм-аут происходит.
>>> import atexit
>>> import sys
>>> import time
>>>
>>>
>>>
>>> def cleanup():
... timeout_sec = 5
... for p in all_processes: # list of your processes
... p_sec = 0
... for second in range(timeout_sec):
... if p.poll() == None:
... time.sleep(1)
... p_sec += 1
... if p_sec >= timeout_sec:
... p.kill() # supported from python 2.6
... print 'cleaned up!'
...
>>>
>>> atexit.register(cleanup)
>>>
>>> sys.exit()
cleaned up!
Примечание - Зарегистрированные функции не будут выполнены, если этот процесс (родительский процесс) будет уничтожен.
следующий метод окон больше не необходим для Python> = 2.6
, Вот способ уничтожить процесс в окнах. Ваш объект Popen имеет изодромный с предварением атрибут, таким образом, можно просто назвать его [1 114] успех = win_kill (p.pid) (Потребности pywin32 установленный):
def win_kill(pid):
'''kill a process by specified PID in windows'''
import win32api
import win32con
hProc = None
try:
hProc = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid)
win32api.TerminateProcess(hProc, 0)
except Exception:
return False
finally:
if hProc != None:
hProc.Close()
return True
Это - то, что я сделал для своего posix приложения:
, Когда Ваше приложение существует, называют уничтожение () методом этого класса: http://www.pixelbeat.org/libs/subProcess.py
использование В качестве примера здесь: http://code.google.com/p/fslint/source/browse/trunk/fslint-gui#608
опрос ()
Проверка, если дочерний процесс завершился. Атрибут кода возврата возвратов.
там способ гарантировать, что весь созданный подпроцесс мертв во время выхода программы Python? Подпроцессом я имею в виду созданных с подпроцессом. Popen ().
Вы могли нарушить инкапсуляцию и тест , который все процессы Popen завершили путем выполнения
subprocess._cleanup()
print subprocess._active == []
В противном случае, я должен выполнить итерации по всему изданию, уничтожает и затем уничтожает-9? что-нибудь инструмент для очистки?
Вы не можете удостовериться, что все подпроцессы мертвы, не выходя и уничтожая каждого оставшегося в живых. Но если у Вас есть эта проблема, это, вероятно, потому что у Вас есть более глубокая проблема проектирования.
На *nix's, возможно, с помощью групп процесса может выручить Вас - можно поймать подпроцессы, порожденные подпроцессами также.
if __name__ == "__main__":
os.setpgrp() # create new process group, become its leader
try:
# some code
finally:
os.killpg(0, signal.SIGKILL) # kill all processes in my group
Другое соображение должно нарастить сигналы: от SIGTERM (сигнал по умолчанию для kill
) к SIGKILL (иначе kill -9
). Ожидайте короткое время между сигналами дать процессу шанс выйти чисто перед Вами kill -9
это.
Эти subprocess.Popen.wait()
единственный способ гарантировать, что они мертвы. Действительно, POSIX, ОС требует, чтобы Вы ожидали на своих детях. Многие *nix's создадут процесс "зомби": мертвый ребенок, которого не ожидал родитель.
, Если ребенок довольно правильно написан, это завершается. Часто, дочерние элементы, считанные из КАНАЛА. Закрытие входа является большой подсказкой ребенку, что это должно закрыть магазин и выход.
, Если ребенок имеет ошибки и не завершается, Вам, вероятно, придется уничтожить его. Необходимо исправить эту ошибку.
, Если дочерний элемент является циклом "подачи навсегда" и не разработан для завершения, необходимо или уничтожить его или обеспечить некоторый вход или сообщение, которое вынудит его завершиться.
<час>Редактирование.
В стандартной ОС, Вы имеете os.kill( PID, 9 )
. Уничтожьте-9, резко, BTW. Если можно уничтожить их с SIGABRT (6?) или SIGTERM (15) это более вежливо.
В Windows OS, Вы не имеете os.kill
, который работает. Посмотрите на этот Рецепт ActiveState для завершения процесса в Windows.
у Нас есть дочерние процессы, которые являются серверами WSGI. Для завершения их, мы делаем Получать на специальном URL; это заставляет ребенка мыться и выходить.