Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205286
  • 博文数量: 48
  • 博客积分: 1935
  • 博客等级: 上尉
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 00:59
文章分类

全部博文(48)

文章存档

2011年(1)

2010年(47)

我的朋友

分类: Python/Ruby

2010-11-10 08:17:50

#from : 
# "这段代码来自于一个很简单的场景:
#  在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"

阅读(1885) | 评论(1) | 转发(0) |
0

上一篇:fckeditor

下一篇:bho

给主人留下些什么吧!~~

chinaunix网友2010-11-10 15:20:16

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com