干干净净杀死进程

最近在写程序时碰到这样一个问题:我想将文件备份到网络驱动器上,但是有一些文件正在被其它程序使用,处于打开状态,而且是被独占打开,这时是没法对文件进行备份操作的。因此,要想备份这些文件,必须将打开它们的那些进程kill掉。那么如何干净地杀死这些打开文件的进程呢?相信看完本文后,自然会有办法解决!

其实,在较新的Windows操作系统版本中有一个工具程序叫tskill.exe,用它就可以解决问题。如图一所示:


图一 tskill程序

要杀掉某个程序的进程,可以输入下面的命令便可以杀死其运行实例:

tskill 程序名

但是我想在自己写的代码里实现tskill的功能该如何做呢?最安全的杀死进程的方法是向运行程序的主窗口发送WM_CLOSE消息。

HWND hwnd = // 获得主窗口
PostMessage(hwnd, WM_CLOSE, 0, 0);
发送此消息后,通常应该等待直到进程确实终止:HANDLE hp = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);
WaitForSingleObject(hp, 5000); // 等待5秒
当进程终止时,它发出状态信号,并且 WaitForSingleObject 返回WAIT_OBJECT_0。如果返回别的值,进程要么挂起了,要么仍然在进行处理。在这种情况下,杀死这个进程的唯一方法是用功能更强大的TerminateProcess:if (WaitForSingleObject(hp, 5000) != WAIT_OBJECT_0)
  TerminateProcess(hp,0);
如果想干得漂亮一点,可以在关闭之前向主窗口发送一个WM_QUERYENDSESSION消息。当用户结束会话(log out)或者有人调用ExitWindows时,应用程序会收到这个消息。然后准备即将来临的死亡。此时一般都会弹出一个确认对话框,告诉世人:“我要完蛋了,如果要保存修改的东西,现在是最佳时机,想保存吗?”有三种选择(Yes/No/Cancel)。此外,WM_QUERYENDSESSION甚至可以拒绝死亡(按下"Cancel键"),如果是这样,生命将会延续。代码应该这样写:DWORD bOKToKill = FALSE;
SendMessageTimeout(hwnd, WM_QUERYENDSESSION, 0, 0,
  SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 100, &bOKToKill);
if (bOKToKill) {
 // 发送WM_CLOSE 并等待
}

时间: 2024-08-07 12:48:27

干干净净杀死进程的相关文章

ASP.NET中编程杀死进程

asp.net|编程|进程 通过ASP.NET可以对一些无用的进程进行远程杀死,下面的代码先列出正在活动的所有进程,然后进行杀死.需要注意的是:这个文件要放在具有Administrator访问权限的虚拟目录下. 以下是C#代码: <%@ Page Language="c#" %><HTML><HEAD><% @ Import namespace= "System.Diagnostics" %><script la

Centos杀死进程kill方法大全

  杀死进程最安全的方法是单纯使用kill命令. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的.终止有问题的进程,并把进程的资源释放给系统.然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源. 为了防止这些所谓的"僵尸进程",应确保在杀死父进程之前,先杀死其所有的子进程. *确定要杀死进程的PID或PPID # ps -ef | grep httpd *以优雅的方式结束进程 #

Window通过cmd查看端口占用、相应进程、杀死进程等的命令

  如何查看程序占用的端口 一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr "指定端口号" 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano

内存回收-android内存不足,系统杀死进程,如果在此之前准确知道快被回收?

问题描述 android内存不足,系统杀死进程,如果在此之前准确知道快被回收? 各位大神: 情况是这样的,应用长时间切后台,会被系统杀掉,然而系统会记住被杀死时的那个activity,而因为上下文所有变量已经丢失,如果单纯新建这样一个activity也是没有太大意义的,所以我的思路是:希望在系统杀死当前进程之前可以捕获到消息,然后在当前应用生命周期内,主动将自己杀死,这样就相当于主动退出应用,下次进来就是重新进入了. 查阅相关资料,Android本身提供一些方法,onLowMemory和onTr

关闭进程-c#windows服务杀死进程

问题描述 c#windows服务杀死进程 在windows服务中想杀死一个指定名称的进程,服务运行起来后,每当执行到process.kill()时,都会报拒绝访问异常 解决方案 windows服务运行的账户不是 administrator,和你桌面账户不是一个.所以你桌面上操作有权限,不等于你的服务有权限. 你可以用AdjustTokenPrivileges提权后再操作http://blog.csdn.net/yiyefangzhou24/article/details/6112233 解决方案

Linux中查看进程及杀死进程命令

Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx'  3405 ?        00:00:00 fcitx <defunct>  3415 ?        00:00:02 fcitx   不显示标题 root@www.linuxidc.com:/home/zhangbin# ps -h Warning: bad ps syntax, perhaps a bogus '-'

Window 通过cmd查看端口占用、相应进程、杀死进程等的命令【转】

一. 查看所有进程占用的端口  在开始-运行-cmd,输入:netstat –ano可以查看所有进程   二.查看占用指定端口的程序  当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr "指定端口号" 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr &

20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程

 场景:实现安装一个apk应用程序的过程.界面如下: 编写如下应用,应用结构如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:

Linux下批量杀死进程(根据关键字杀死进程)

进程在计算机中是一个程序执行过程的标志,当程序执行完时,相应的进程也该终止.但是实际情况中很多进程没有在程序执行终止时死掉,于是变成了僵尸进程,少量的僵尸进程并不会影响服务器的性能,但是任何服务器在进程很多的时候都无法提供很好的性能. 有时候因为一些特殊情况,需要把 linux 下符合某一项条件的所有进程 kill 掉,又不能用 killall 直接杀掉某一进程名称包含的所有运行中进程(我们可能只需要杀掉其中的某一类或运行指定参数命令的进程),这个时候我们需要运用 ps, grep, cut 和