草庐IT

windows - Closehandle() 不终止进程

coder 2024-06-07 原文

CloseHandle() 中关闭其句柄后,进程未终止。

我有一个由 CreateProcess() api 创建的进程。即使在关闭其句柄后,它仍在运行。

在 msdn 中,他们说 CloseHandle() 关闭句柄并且不会终止进程。必须为此调用终止线程。那为什么要CloseHandle()呢?

但是当我检查CloseHandle() 的返回值时,它成功了。如果是这样,我想知道在这个 CloseHandle() 中实际做了什么以及它为什么成功返回。我想知道使用它的句柄可以在进程上完成哪些所有操作。我觉得误导了,因为 CloseHandle() 成功了,但进程仍在继续!

进程句柄中实际包含的内容也很棒,与其他类型的句柄有什么区别吗? (文件、I/O 等)

最佳答案

为什么关闭句柄并没有终止进程?为此必须调用 TerminateProcess

关闭句柄并不会终止进程,因为这很荒谬。进程通常彼此独立运行。如果关闭进程句柄终止了相应的进程,情况就不会是这样,因为当程序退出时,它持有的所有打开的句柄都会关闭。例如,这意味着如果资源管理器崩溃,您启动的每个程序 将立即终止。那将是一场灾难,因此关闭进程句柄在设计上不会终止程序。

终止进程几乎总是一个非常糟糕的主意。终止线程也是如此。如果可以避免,永远不要这样做。如果您希望线程/进程退出,请向它发送一条消息并等待它退出(代表它自己)。这保证了数据被正确保存并处于一致的状态,没有资源泄漏,并且不会发生严重的冲突(例如线程在持有锁时被终止)。
终止线程通常很麻烦,有时甚至是灾难性的。终止进程也是如此。只有当进程或线程陷入无限循环且无响应时,才“允许”终止进程或线程。

那为什么你无论如何都要关闭 handle ,如果你必须关闭它,你为什么还要一个?

您可以使用句柄做某些事情,例如 ReadProcessMemoryWriteProcessMemoryCancelIoEx、运行调试器、使用 PSAPI , 和其他一些。您也可以等待句柄,当进程退出时会发出信号。这是一种非常简单的进程间同步方式。
另一方面,操作系统不能释放资源,只要你保持句柄打开,从而拥有访问这些资源的“合法权利”。例如,如果进程(或至少其结构)根本不存在,您如何等待进程?

这(以及句柄本身是一种资源的事实)就是为什么您应该尽快关闭句柄如果您不需要它。无限期持有它需要操作系统保留不需要但无法释放的资源。
关闭句柄会告诉操作系统您不再需要它,因此无论何时操作系统想要释放与该进程关联的所有资源,它都可以这样做。

进程句柄中包含什么?

与所有句柄一样,进程句柄只是一个不包含任何内容的不透明整数。它是内核拥有的表中的索引,技术上是 void*,但这只是一个实现细节。它所指的实际内核结构不是您可以直接访问的东西,无论如何都不是一种简单的方式。

关于windows - Closehandle() 不终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834685/

有关windows - Closehandle() 不终止进程的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  8. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  9. ruby - 在 ruby​​ 中生成一个进程,捕获 stdout,stderr,获取退出状态 - 2

    我想从ruby​​rake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调

  10. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

随机推荐