在Windows上运行任意的子进程,并且仍然彻底终止?
我有一个应用程序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()将失败. 创建您的Helper.exe使用CREATE_NO_WINDOW和CREATE_NEW_PROCESS_GROUP创建它. 这是非常重要的每个步骤都是这样完成的.我一直在尝试所有不同种类的组合,但是这种组合是唯一可以组合的组合.您不能发送CTRL_C事件.它将返回成功,但将被该过程忽略. CTRL_BREAK是唯一可以使用的功能.并不重要,因为他们最终会调用ExitProcess(). 您也无法使用子进程标识的进程groupd id调用GenerateConsoleCtrlEvent(),直接允许帮助程序继续生存.这也会失败. 我花了一整天试图让这个工作.这个解决方案适用于我,但如果有任何其他的东西要添加,请做.我去了所有其他网络找到很多有类似问题的人,但没有明确的解决方案. GenerateConsoleCtrlEvent()的工作原理也是有点奇怪,所以如果有人知道更多的细节,请分享. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |