用Python杀掉windows平台下的进程详解编程语言

# "这段代码来自于一个很简单的场景: 
#  在python中调一个程序。给这个程序设置一个timeout 
#  假如一段时间程序还没有返回,就杀掉这个这个新开的进程。" 
 
import ctypes 
import sys 
 
TH32CS_SNAPPROCESS = 0x00000002 
class PROCESSENTRY32(ctypes.Structure): 
     _fields_ = [("dwSize", ctypes.c_ulong), 
                 ("cntUsage", ctypes.c_ulong), 
                 ("th32ProcessID", ctypes.c_ulong), 
                 ("th32DefaultHeapID", ctypes.c_ulong), 
                 ("th32ModuleID", ctypes.c_ulong), 
                 ("cntThreads", ctypes.c_ulong), 
                 ("th32ParentProcessID", ctypes.c_ulong), 
                 ("pcPriClassBase", ctypes.c_ulong), 
                 ("dwFlags", ctypes.c_ulong), 
                 ("szExeFile", ctypes.c_char * 260)] 
 
def getProcList(): 
    CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot 
    Process32First = ctypes.windll.kernel32.Process32First 
    Process32Next = ctypes.windll.kernel32.Process32Next 
    CloseHandle = ctypes.windll.kernel32.CloseHandle 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) 
    pe32 = PROCESSENTRY32() 
    pe32.dwSize = ctypes.sizeof(PROCESSENTRY32) 
    if Process32First(hProcessSnap,ctypes.byref(pe32)) == False: 
        print >> sys.stderr, "Failed getting first process." 
        return 
    while True: 
        yield pe32 
        if Process32Next(hProcessSnap,ctypes.byref(pe32)) == False: 
            break 
    CloseHandle(hProcessSnap) 
 
def getChildPid(pid): 
    procList = getProcList() 
    for proc in procList: 
        if proc.th32ParentProcessID == pid: 
            yield proc.th32ProcessID 
 
def killPid(pid): 
    childList = getChildPid(pid) 
    for childPid in childList: 
        killPid(childPid) 
    handle = ctypes.windll.kernel32.OpenProcess(1, False, pid) 
    ctypes.windll.kernel32.TerminateProcess(handle,0) 
 
if __name__ =='__main__': 
    args = sys.argv  
    if len(args) >1 : 
        pid = int(args[1]) 
        killPid(pid) 
    else: 
        procList = getProcList() 
        for proc in procList: 
            print proc.szExeFile+'  '+str(proc.th32ParentProcessID) + '  '+str(proc.th32ProcessID) 
 
#---------------------- 
# 
# Usage demo 
# 
#---------------------- 
import subprocess 
import time 
 
#import winproc 
 
timeout = 2 
process = subprocess.Popen("cmd /k ping localhost -t",shell = True) 
start = int(time.time()) 
while process.poll()==None: 
    now = int(time.time()) 
    if int (now - start) >timeout: 
        pid = process.pid 
        break 
 
winproc.killPid(pid) 
 
print "End"

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/8514.html

(0)
上一篇 2021年7月18日 19:45
下一篇 2021年7月18日 19:45

相关推荐

发表回复

登录后才能评论