首页 / 知识
关于C#:在Win32上停止进程的最简单方法?
2023-04-16 11:57:00

Cleanest way to stop a process on Win32?在用C ++实现应用服务器及其客户端库时,我很难找到一种干净可靠的方法来停止Windows上服务器关闭时的客户端进程。 假设服务器及其客户端在同一用户下运行,则要求是:
在进行此编辑时,以下大多数答案都主张在服务器及其客户端之间使用共享内存(或其他IPC机制)来传达关闭命令和客户端状态。这些解决方案可以使用,但是需要客户端成功初始化库。 我没有说的是,服务器还用于启动客户端,在某些情况下还用于根本不使用客户端库的其他程序/脚本。一个不依赖服务器与客户端之间正常通信的解决方案会更好(如果可能)。 前一段时间,我偶然发现了一个C片段(在我相信的MSDN中),该片段执行以下操作: 不幸的是,现在我正在寻找它,我找不到它,并且搜索结果似乎暗示此技巧在Vista上不再起作用。有什么专家意见吗? 如果使用线程,一个简单的解决方案是使用命名的系统事件,线程在事件上休眠以等待被信号通知,控制应用程序可以在希望客户端应用程序退出时向事件发送信号。 对于UI应用程序,它(线程)可以将消息发布到主窗口中,WM_ CLOSE或QUIT我忘记了,在控制台应用程序中它可以发出CTRL-C,或者如果主控制台代码循环了,它可以检查某些退出条件由线程设置。 不管用哪种方法,都不要使用指示客户端退出的客户端应用程序,而是使用OS发出信号来指示它们应该退出。如果睡眠线程使用WaitForSingleObject进行睡眠,则实际上将不占用任何CPU资源。 使用PostMessage或命名事件。 回复:PostMessage-GUI以外的应用程序以及GUI线程以外的线程都可以具有消息循环,这对于诸如此类的事情非常有用。 (实际上,COM在幕后使用了消息循环。)我之前使用ATL做到过,但是对此有些生锈。 如果要对来自"不良"进程的恶意攻击保持鲁棒性,请包括客户端/服务器共享的私钥作为消息中的参数之一。 命名事件方法可能更简单;使用名称为客户端/服务器共享的机密名称的CreateEvent,并让相应的应用在其主循环中检查事件的状态(例如,超时为0的WaitForSingleObject),以确定是否关闭。 如果您愿意使用IPC路由,请使客户端和服务器之间进行正常的双向通信,以使服务器要求客户端关闭。否则,请客户进行投票。或作为最后的手段,当向服务器发出请求时,应指示客户端退出。您可以让库用户注册退出回调,但是据我所知,最好的方法是在告知客户端关闭时,在客户端库中简单地调用" exit"。如果客户端陷入关机代码中,则服务器需要能够通过忽略该客户端的数据结构和连接来解决该问题。 您需要客户端和服务器之间的某种IPC。如果所有客户都是孩子,我认为管道将是最容易的。因为它们不是,所以我猜一个服务器操作的共享内存段可用于注册客户端,发出shutdown命令并收集成功关闭客户端发布的返回代码。 客户端在此共享内存区域中放置其进程ID,以便服务器可以使用TerminateProcess()强制终止任何无响应的客户端(对服务器进行模数化)。 这是一个非常普遍的问题,并且存在一些不一致之处。 尽管这不是100%的规则,但是大多数控制台应用程序都可以运行完成,而GUI应用程序可以运行直到用户终止它们为止(服务一直运行到通过SCM停止为止)。因此,请求关闭GUI更容易。您发送给他们相当于Alt-F4。但是对于控制台程序,您必须向他们发送等效于Ctrl-C的控件,并希望它们能够处理它。在这两种情况下,您只需等待。如果该过程仍然存在,则可以将其击落(TerminateProcess),并祈祷损害受到限制。但是您的HDD可以填充临时文件。 GUI应用程序通常没有退出代码-它们会去哪里?并且被定义强行终止的控制台进程不会退出,因此它没有退出代码。因此,在服务器关闭的情况下,不要期望退出代码。 如果连接了调试器,通常无法从另一个应用程序中关闭该进程。这将使调试器无法调试退出代码! |
最新内容
相关内容
linux命令守护进程?
linux命令守护进程?,系统,服务,环境,状态,名字,进程,异常,基础,代码,下来,如何正确编写linux守护进程1、(1)若守护进程使用锁文件,那么该文件通常纯命令行linux服务器?
纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,在linux下如何访问服务器首先,连接相应linux主机,进入到linux命令行linux截取进程命令?
linux截取进程命令?,系统,工作,状态,信息,进程,软件,地址,命令,标准,实时,linux中查看系统当前所有进程的命令是1、linux 下查看进程可以使用linux退出进程命令?
linux退出进程命令?,系统,软件,名称,代码,进程,报告,数字,暂停,状态,平台,linux停止进程在linux系统中停止进程需要以下三个步骤,下面具体介绍linux下进程调试命令?
linux下进程调试命令?,系统,工作,软件,信息,命令,基础,地址,状态,进程,实时,Linuxquid安装调试中几个常用命令介绍1、使用mkdir 命令创建一个linux命令限制进程?
linux命令限制进程?,系统,时间,管理,周期,进程,命令,传播,地方,名称,标准,Linux终止前台进程的命令1、首先,连接相应linux主机,进入到linux命令linux长命令查看进程?
linux长命令查看进程?,系统,状态,信息,数据,软件,进程,情况,总量,实时,命令,linux查看进程的命令1、linux 下查看进程可以使用的命令:ps命令查linux切换进程命令?
linux切换进程命令?,服务,系统,工具,地址,命令,基础,工作,标准,情况,状态,Linux命令有哪些1、linux常用命令如下:查看内核版本:uname-a。控制台-检查linux服务器命令?
检查linux服务器命令?,系统,信息,状态,情况,时间,工具,网络,环境,服务,电脑,如何查看linux服务器的版本和配置信息?1、登录到linux服务器执行llinux同步客户端命令?
linux同步客户端命令?,时间,网络,服务,系统,认证,状态,管理,信息,分析,地址,linux中的rsync同步怎么配置1、至此,设置 ssh 认证完毕。设置 rsynlinux查询命令进程?
linux查询命令进程?,系统,名称,总量,情况,状态,进程,材料,工具,电脑,数据,怎么查看linux进程名称1、linux 下查看进程可以使用的命令:ps命令查linux命令如何杀进程?
linux命令如何杀进程?,状态,系统,暂停,管理,进程,命令,平台,信息,工具,电脑,Linux终止前台进程的命令首先,连接相应linux主机,进入到linux命令行