我是Winapi/C++的初学者,在一项简单的大学任务上已经困了一段时间。
我已经使用POSIX中的fork()
编写了一个类似的程序。我的问题是,Windows如何使用单个.exe
文件来分离/识别哪个进程被视为父进程/子进程?
为了简化问题,我决定确保家长总是先启动,等待所有孩子完成,然后关闭。
在子进程中打印命令行参数,每个进程只打印一个参数,父进程等待它们完成并关闭。简而言之,父进程只产生进程,子进程完成任务。
例如,命令行调用如下所示:
untitled.exe a b c
预期输出将按随机顺序排列:
Child process #1: a
Child process #2: b
Child process #3: c
Parent finishes...
我尝试通过命令行参数将单个参数传递给每个子进程,因此每个子进程都得到:untitled.exe argv[index]
,其中index
代表参数范围[a, b, c]
。这个解决方案是错误的,因为父代可能会得到一个参数,而子代不会生成。
if (argc <= 2){...}
我想使用一个单独的.exe
文件,但我希望避免这种解决方案。
我想使用共享内存,但在这种情况下,我如何区分父母和每个孩子?
编辑:
最小推荐示例:
int _tmain(int argc, TCHAR *argv[]) {
for (int i = 1; i < argc; ++i) {
if (argc <= 2){
//print if only has two arguments and finish
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CHAR *temp;
sprintf(temp,"%s%s%s",argv[0]," ",argv[i]);//create new command line call to pass to createProcess
if (!CreateProcess(nullptr, // No module name (use command line)
temp, // exe with one argument
nullptr, // Process handle not inheritable
nullptr, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
nullptr, // Use parent's environment block
nullptr, // Use parent's starting directory
&si, // Pointer toa STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
) {
printf("CreateProcess failed (%d).n", GetLastError());
return 0;
}
else {
std::cout << "Child created" << std::endl;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
"我的问题是,Windows如何使用单个.exe文件来分离/识别哪个进程被视为父进程/子进程">
fork((函数创建一个新进程。新进程(子进程(应是调用进程(父进程(的精确副本。CreateProcess创建一个新进程并从磁盘加载程序。
在Windows中,您可以读取InheritedFromUniqueProcessId
值,但这不会告诉您是哪个进程启动了您的进程。它只是告诉从何处继承了句柄和其他属性。
有关fork((和CreateProcess((之间区别的更多详细信息,我建议您可以参考线程:forking((和CreateProcess((