Windows系统下C++父子进程通信:P2向P1发信号最简实现咨询
实现P2向P1发送消息的最简单机制
对于仅需定时触发P1执行函数、无需传递复杂附加数据的需求,最简单的实现是使用Windows消息机制,不需要引入管道、共享内存等重量级IPC方案,逻辑如下:
- 如果P1有UI窗口:直接使用
PostMessage向P1的窗口句柄发送自定义消息即可,自定义消息可通过WM_USER + 自定义偏移定义,不会和系统消息冲突。 - 如果P1是无窗口控制台程序:可以使用
PostThreadMessage向P1的主线程发送自定义线程消息,P1的主线程循环中添加对应消息处理逻辑,收到指定消息时调用函数F即可。
该方案编码量极少,不需要额外维护IPC连接,完全满足每30分钟发送一次触发信号的需求。
PPID传递可行性说明
你完全可以通过CreateProcess向P2传递PPID、P1主线程ID、P1窗口句柄这类身份标识,传递方式非常简单:
- P1启动时先获取自身的进程ID/主线程ID/窗口句柄,将其转为字符串拼接在P2的启动命令行参数中,示例代码参考:
// P1侧构造P2启动命令行 wchar_t cmdLine[256]; swprintf_s(cmdLine, L"P2.exe %d", GetCurrentProcessId()); CreateProcess(NULL, cmdLine, ......);
- P2启动后直接读取
argv参数即可拿到PPID,不需要额外做进程枚举操作获取父进程ID。
注意:如果要使用
PostThreadMessage发消息,建议P1把自身主线程ID也通过命令行传给P2,比通过PPID再枚举线程效率更高。
补充说明:进程ID是系统全局唯一的,只要P1没有退出,ID就不会被复用,不会出现发错消息的问题;如果担心P1意外退出后ID被复用,P2发消息前可以先调用OpenProcess打开PPID,判断返回句柄是否有效即可。
内容的提问来源于stack exchange,提问作者Léa Massiot
相关产品推荐
相关产品推荐

