加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在Windows上运行任意的子进程,并且仍然彻底终止?

发布时间:2020-12-13 20:16:44 所属栏目:Windows 来源:网络整理
导读:我有一个应用程序A,我想要能够调用用户在配置文件中指定的任意其他进程. 批处理脚本B是用户想要被A调用的一个这样的过程.B设置一些环境变量,显示一些消息并调用编译器C来做一些工作. Windows为任意进程提供了一种标准的方式来彻底终止?假设A在控制台中运行
我有一个应用程序A,我想要能够调用用户在配置文件中指定的任意其他进程.

批处理脚本B是用户想要被A调用的一个这样的过程.B设置一些环境变量,显示一些消息并调用编译器C来做一些工作.

Windows为任意进程提供了一种标准的方式来彻底终止?假设A在控制台中运行并接收到CTRL C.可以将其传递给B和C吗?假设A在窗口中运行,用户尝试关闭窗口,可以取消B和C吗?

TerminateProcess是一个选项,但不是很好的选项.如果A在B上使用TerminateProcess,C将继续运行.如果C长时间运行,这可能会导致讨厌的问题,因为我们可能会启动C的另一个实例来操作相同的文件,而C的第一个实例仍然在秘密工作.此外,TerminateProcess不会导致干净的退出.

GenerateConsoleCtrlEvent听起来不错,并且当所有的控件都运行时可能会工作,但文档说您只能将CTRL C发送到自己的控制台,因此如果A在窗口中运行,则不会有帮助.

在Windows上有没有相当于SIGINT?我很想找到像这样的文章:http://www.cons.org/cracauer/sigint.html for Windows.

我想我在这个问题上有点迟了,但我会为任何有同样问题的人写东西.

我的问题是类似的,我希望我的应用程序是一个GUI应用程序,但执行的进程应该运行在后台没有任何交互式控制台窗口.

我设法使用GenerateConsoleCtrlEvent()解决这个问题.这个棘手的部分只是说明文档并不清楚它的使用方式及其陷阱.

我的解决方案是基于所描述的here.但是这并没有真正解释所有的细节,所以这里是有关如何使其工作的细节.

>创建一个新的帮助程序“Helper.exe”.此应用程序将位于您的应用程序(父级)和您想要关闭的子进程之间.它还将创建实际的子进程.你必须有这个“中间人”的进程或GenerateConsoleCtrlEvent()将失败.
>使用某种IPC机制来从父进程到帮助程序进行通信,帮助程序应该关闭子进程.当帮助者获取此事件时,它会调用“GenerateConsoleCtrlEvent(CTRL_BREAK,0)”,它会自动关闭子进程.我自己使用一个事件对象,父对象要在其中取消子进程时完成该对象.

创建您的Helper.exe使用CREATE_NO_WINDOW和CREATE_NEW_PROCESS_GROUP创建它.
而当创建子进程创建它没有标志(0)意味着它将从其父进程导出控制台.不这样做会导致它忽略该事件.

这是非常重要的每个步骤都是这样完成的.我一直在尝试所有不同种类的组合,但是这种组合是唯一可以组合的组合.您不能发送CTRL_C事件.它将返回成功,但将被该过程忽略. CTRL_BREAK是唯一可以使用的功能.并不重要,因为他们最终会调用ExitProcess().

您也无法使用子进程标识的进程groupd id调用GenerateConsoleCtrlEvent(),直接允许帮助程序继续生存.这也会失败.

我花了一整天试图让这个工作.这个解决方案适用于我,但如果有任何其他的东西要添加,请做.我去了所有其他网络找到很多有类似问题的人,但没有明确的解决方案. GenerateConsoleCtrlEvent()的工作原理也是有点奇怪,所以如果有人知道更多的细节,请分享.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读