我在此试图修改他的方案。 我是视窗地和陈列型的游客,因此,我希望我没有做任何事情。
import ctypes, subprocess
from random import randint
import os
SYNCHRONIZE=0x00100000
PROCESS_QUERY_INFORMATION=0x0400
INFINITE = -1
numprocs = 5
handles = {}
class Err(BaseException): pass
for i in xrange(numprocs):
sleeptime = randint(5,10)
p = subprocess.Popen([r"c:MinGWmsys1.0insleep.exe", str(sleeptime)], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
h = ctypes.windll.kernel32.OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, False, p.pid)
handles[h] = p.pid
print "Spawned Process %d" % p.pid
while len(handles) > 0:
print "Waiting for %d children..." % len(handles)
arrtype = ctypes.c_long * len(handles)
handle_array = arrtype(*handles.keys())
ret = ctypes.windll.kernel32.WaitForMultipleObjects(len(handle_array), handle_array, False, INFINITE)
h = handle_array[ret]
print "Process %d done" % handles[h]
i = ctypes.c_int(0)
pi = ctypes.pointer(i)
if ctypes.windll.kernel32.GetExitCodeProcess(h, pi) == 0:
err = ctypes.windll.kernel32.GetLastError()
raise Err("GetExitCodeProcess: %d" % (err))
print "Status code is: %d" % (i)
if ctypes.windll.kernel32.CloseHandle(h) == 0:
err = ctypes.windll.kernel32.GetLastError()
raise Err("CloseHandle: %d" % (err))
del handles[h]
print "All done!
但是,在我执政的时候,我失败了:
Traceback (most recent call last):
File "test.py", line 30, in <module>
raise Err("GetExitCodeProcess: %d" % (err))
__main__.Err: GetExitCodeProcess: 6
看来,error 6 is ERR_INVALID_HANDLE。 但是,我不敢肯定的是,如果我发表以下意见,则要求获得<条码>PROCESS_questRY_INFORMATION的许可和<条码>CloseHandle(>的打字。 GetExitCodeProcess()。
任何想法? 在等待一些进程之后,我如何获得地位法?