带有参数死锁的 C++ CreateProcess
Posted
技术标签:
【中文标题】带有参数死锁的 C++ CreateProcess【英文标题】:C++ CreateProcess with arguments deadlock 【发布时间】:2017-07-20 10:56:48 【问题描述】:我有两个应用程序(exe)。
第一个 (client.exe
) 只是打印出参数:
#include <iostream>
int main(int argc, char** argv)
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i)
std::cout << argv[i] << std::endl;
return 0;
第二个 (SandBox.exe
) 使用一些参数执行第一个:
#include <iostream>
#include <Windows.h>
void startup(LPCTSTR lpApplicationName, LPSTR param)
// additional information
STARTUPINFO si;
PROCESS_INFORMATION pi;
// set the size of the structures
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// start the program up
CreateProcess(lpApplicationName, // the path
param,//NULL,//argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure
);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
int main()
startup(TEXT("client.exe"), TEXT("client.exe thisIsMyFirstParaMeter AndTheSecond"));
return 0;
从SandBox.exe
执行client.exe
,输出很奇怪,client.exe永远不会结束,一直处于死锁状态。
这里有什么问题?
我期待一些输出,例如(例如当我运行 client.exe
隔离时):
谢谢
【问题讨论】:
你怎么知道是死锁?CreateProcess
的第二个参数必须指向可变字符串,AFAIK。
如果在main()
处理关闭之前使用WaitForSingleObject( pi.hProcess, INFINITE );
等待客户端进程结束会发生什么?
就是这样@vasek :) 你能把它写成答案,这样我就可以关闭这个帖子了吗?
明确一点:client.exe
确实 以原始版本结尾(它的最终d
可以在C:\>
提示之前看到)问题是因为父进程不等待就立即退出,所以客户端的输出与命令窗口的输出混合在一起。如果父进程也要打印一些文本,您可能会看到类似的内容。
【参考方案1】:
您的控制应用程序应该等到客户端退出。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx
// start the program up
CreateProcess(lpApplicationName, // the path
param, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure
);
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE ); // <--- this
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
【讨论】:
以上是关于带有参数死锁的 C++ CreateProcess的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?