如何CTRL-C子进程?

cranium cranium 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
啊,真是被这个问题整无奈了。

问题描述:通过一个进程(CUI/GUI)向另一个CUI进程发送CTRL-C,使后者结束执行。

基本要求:1 CUI子进程无法更改,如PING。
2 父进程可以是GUI,也可以是CUI进程。
3 保证子进程有机会在结束前保存其数据。一般CUI应该对用户点击关闭按钮和CTRL-C这2种关闭方式有对应的处理,以保证其数据可以被保存。这第三条的要求其实就是说实现的方式不要比CTRL-C和点击关闭按钮来得更暴力就可以。


目前花了近30个小时,查看各类文档,试验各种技术,代码组合,仅一种方式可以实现:

	
TCHAR cmdline[] = _T("ping 127.0.0.1 -t");
BOOL b = CreateProcess(NULL,cmdline,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
if (!b)
{
printf("CreateProcess failed!\n");
return -1;
}
SetConsoleCtrlHandler(CtrlHandler,TRUE);

这样子可以做到CTRL-C的时候结束PING子进程。但是离我要求的发送CTRL-C还有距离。

下面的是另外的实现,这种情况很恶心,拜其所赐,30多小时毫无进展。
	TCHAR cmdline[] = _T("ping 127.0.0.1 -t");
BOOL b = CreateProcess(NULL,cmdline,NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP,NULL,NULL,&si,&pi);
if (!b)
{
printf("CreateProcess failed!\n");
return -1;
}
SetConsoleCtrlHandler(CtrlHandler,TRUE);
//中间略去一些无关紧要的代码
GenerateConsoleCtrlEvent(CTRL_C_EVENT,pi.dwProcessId);

无论怎么发送CTRL-C或者是你手动CTRL-C,PING都不会理会(这就是其恶心之处,在同一个CONSOLE下,PING子程序用着通用的ctrl handler居然不处理CTRL-C)

上面就是大概的描述,请问有知道此问题如何解决的吗?


最后附上我的测试代码方便大家试验(用了预编译头,你可能需要更改下头文件的引用)
#include "stdafx.h"
#include <Windows.h>
#include <process.h>

PROCESS_INFORMATION pi;

BOOL WINAPI CtrlHandler(DWORD dwCtrlType)
{
switch (dwCtrlType)
{
case CTRL_C_EVENT:
printf("Pid=%d",_getpid());
return TRUE;
case CTRL_BREAK_EVENT:
printf("server Break Event\n");
printf("%s",GenerateConsoleCtrlEvent(CTRL_C_EVENT,pi.dwProcessId)?"true\n":"false\n");
return TRUE;
default:
return FALSE;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
ZeroMemory(&pi,sizeof(pi));
si.cb = sizeof(si);
TCHAR cmdline[] = _T("ping 127.0.0.1 -t");
BOOL b = CreateProcess(NULL,cmdline,NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP,NULL,NULL,&si,&pi);
if (!b)
{
printf("CreateProcess failed!\n");
return -1;
}
SetConsoleCtrlHandler(CtrlHandler,TRUE);

int i = 0;
while(1)
{
scanf("%d",&i);
if (i==1)
{
ZeroMemory(&pi,sizeof(pi));
b = CreateProcess(NULL,cmdline,NULL,NULL,FALSE,NULL/*CREATE_NEW_PROCESS_GROUP*/,NULL,NULL,&si,&pi);
}
if (i>1)
{
//GenerateConsoleCtrlEvent(CTRL_C_EVENT,pi.dwProcessId);
printf("%s",GenerateConsoleCtrlEvent(CTRL_C_EVENT,i)?"true\n":"false\n");
}
if(WaitForSingleObject(pi.hProcess,200)==WAIT_OBJECT_0)
printf("Ping exited!");
// break;
}
return 0;
}

...全文

相关推荐

Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的区别和使用详解

Ctrl+c,Ctrl+d,Ctrl+z在Linux中意义 Ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. Ctrl+c是强制中断程序的执行。 Ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态。 [root@localhost ~]# ping baidu.com PING baidu.com (220.181.57.217) 56(84) bytes of data. 64 bytes from 220.181.57.217: icmp_seq=1 ttl=128 time=58.7 ms 64 bytes from 220.181.5

weixin_38741996

浅谈ctrl+c,ctrl+d,ctrl+z在linux中的意义

下面小编就为大家带来一篇浅谈ctrl+c,ctrl+d,ctrl+z在linux中的意义。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38682161

Linux父子进程通信(子进程反转输出,屏蔽Ctrl+c,按Q或q退出)

根据要求完成父进程与子进程之间通信。 父进程定时、随机产生一个由 12 个字符组成的字符串,子进程获取此字符 串后将字符串反转后输出并通知父进程。要求程序在运行过程种屏蔽 “Ctrl+C”,仅当程序接收到键盘输入“q”或“Q”时退出。

Ve_Sper

控制ctrl +c复制,ctrl+v粘贴

控制ctrl +c复制,ctrl+v粘贴,能够灵活使用或禁用复制,粘贴

kzccomputer

python subprocess 杀掉全部派生的子进程方法

下面小编就为大家带来一篇python subprocess 杀掉全部派生的子进程方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38690017
评论 11
收藏 已收藏
分享
返回顶部
cranium
进程/线程/DLL 15,466 成员 49,169 内容