C 中的 CreateProcessA、Wait 和 ExitCode - 获取错误的退出代码
CreateProcessA,Wait and ExitCode in C - getting wrong exit code
我在使用 CreateProcessA 和 Wait(...) 函数的 C 代码中遇到问题。一切似乎都工作正常,除了退出代码。它始终为 0。我知道(至少)这部分代码(带有退出代码)是错误的,但我尝试了很多方法来修复它并且 none 确实有效。此外,当在控制台中显示 PID 时,有时它们不在应有的位置(例如:有 3 行具有相同的 PID,有时会有一个来自其他组的额外 PID,例如:6656 6656 1234 6656 ...)。也许你们知道解决方案。这是代码:
...//some argument conditions above
STARTUPINFO si;
PROCESS_INFORMATION pi[2];
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
int argument = atoi(argv[1]);
int argument1 = argument - 1;
int argument2 = argument - 2;
char a1[50];
sprintf(a1, "file.exe %d", argument1);
BOOL v1 = CreateProcessA("file.exe", a1, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi+0);
char a2[50];
sprintf(a2, "file.exe %d", argument2);
BOOL v2 = CreateProcessA("file.exe", a2, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi+1);
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
unsigned long int exit1 = GetExitCodeProcess(children[0], &exit1);
unsigned long int exit2 = GetExitCodeProcess(children[1], &exit2);
printf("%d \t %d \t %d \t %d \t\n", GetCurrentProcessId(), pi[0].dwProcessId, argument1, exit1);
printf("%d \t %d \t %d \t %d \t\n", GetCurrentProcessId(), pi[1].dwProcessId, argument2, exit2);
printf("%d \t \t \t %d\n\n", GetCurrentProcessId(), exit1 + exit2);
return exit1 + exit2;
}
感谢您的帮助。
在此代码中:
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
unsigned long int exit1 = GetExitCodeProcess(children[0], &exit1);
unsigned long int exit2 = GetExitCodeProcess(children[1], &exit2);
一个问题是 exit1
和 exit2
被初始化为 GetExitCodeProcess
的 return 值。该函数具有 return 类型的 BOOL
和 returns 0 (FALSE
) 失败时,或非零值(大概是 1 (TRUE
) ) 成功。由于进程句柄已在前面的 for
循环中关闭,因此 GetExitCodeProcess
将 return 失败值 0。
尝试将其更改为以下内容:
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
DWORD exit1, exit2;
GetExitCodeProcess(children[0], &exit1);
GetExitCodeProcess(children[1], &exit2);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
我在使用 CreateProcessA 和 Wait(...) 函数的 C 代码中遇到问题。一切似乎都工作正常,除了退出代码。它始终为 0。我知道(至少)这部分代码(带有退出代码)是错误的,但我尝试了很多方法来修复它并且 none 确实有效。此外,当在控制台中显示 PID 时,有时它们不在应有的位置(例如:有 3 行具有相同的 PID,有时会有一个来自其他组的额外 PID,例如:6656 6656 1234 6656 ...)。也许你们知道解决方案。这是代码:
...//some argument conditions above
STARTUPINFO si;
PROCESS_INFORMATION pi[2];
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
int argument = atoi(argv[1]);
int argument1 = argument - 1;
int argument2 = argument - 2;
char a1[50];
sprintf(a1, "file.exe %d", argument1);
BOOL v1 = CreateProcessA("file.exe", a1, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi+0);
char a2[50];
sprintf(a2, "file.exe %d", argument2);
BOOL v2 = CreateProcessA("file.exe", a2, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi+1);
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
unsigned long int exit1 = GetExitCodeProcess(children[0], &exit1);
unsigned long int exit2 = GetExitCodeProcess(children[1], &exit2);
printf("%d \t %d \t %d \t %d \t\n", GetCurrentProcessId(), pi[0].dwProcessId, argument1, exit1);
printf("%d \t %d \t %d \t %d \t\n", GetCurrentProcessId(), pi[1].dwProcessId, argument2, exit2);
printf("%d \t \t \t %d\n\n", GetCurrentProcessId(), exit1 + exit2);
return exit1 + exit2;
}
感谢您的帮助。
在此代码中:
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
unsigned long int exit1 = GetExitCodeProcess(children[0], &exit1);
unsigned long int exit2 = GetExitCodeProcess(children[1], &exit2);
一个问题是 exit1
和 exit2
被初始化为 GetExitCodeProcess
的 return 值。该函数具有 return 类型的 BOOL
和 returns 0 (FALSE
) 失败时,或非零值(大概是 1 (TRUE
) ) 成功。由于进程句柄已在前面的 for
循环中关闭,因此 GetExitCodeProcess
将 return 失败值 0。
尝试将其更改为以下内容:
HANDLE children[2] = { pi[0].hProcess, pi[1].hProcess };
WaitForMultipleObjects(2, children, 1, INFINITE);
DWORD exit1, exit2;
GetExitCodeProcess(children[0], &exit1);
GetExitCodeProcess(children[1], &exit2);
for (int i = 1; i >= 0; i--)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}