windows使用windows-kill模拟ctrl+c信号进行进程通信

今天我运行aria2c下载视频时发现如果强制终止进程的话,aria2c无法进行断点重下,但是ctr-c的话就能下载

可是如何在编程中模拟Ctrl+c,在网上搜索一番,在github找到了一个开源项目windows-kill,下载下来是一个exe,windows-kill.exe,

只要命令行执window-kill.exe -2 pid就能向目标进程发送ctrl-c信号了。

然后我就用c++调用了aric2c进行下载,用window-kill.exe 进行停止,但是这里出现了问题,当我发送ctrl+c信号时我的主程序也收到了ctrl+c信号,导致程序直接崩溃

在网上查找许久,原来想要模拟终端ctr-c信号,就必须和目标进程共用一个控制台,发送ctr+c信号后会向所有共享这个控制台的进程发送ctr-c信号。由于我和aria2c进程共享了控制台,又和windows-kill共享了控制台,这样windows-kill一发送ctr+c信号,我自己也收到了

要想自己不接收ctr+c信号可以调整创建进程的方式,创建进程时createProcess指定CREATE_NO_WINDOW,这样就不会和自己共享一个控制台,aria2c进程和window-kill进程创建时都指定这个字段,这样发送的时候自己就不会收到crtl+c异常而导致崩溃了
也可以用代码实现

AttachConsole(p_pid);
SetConsoleCtrlHandler(NULL, true);
GenerateConsoleCtrlEvent(CTRL_C_EVENT, p_pid);
FreeConsole();

注意createProcess 子进程时要指定 CREATE_NEW_PROCESS_GROUP才能生效

posted @ 2021-12-20 16:28  乘舟凉  阅读(1812)  评论(0编辑  收藏  举报