如何在子进程中打印命令行参数



我是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((

最新更新