尝试生成多个相同进程时崩溃(访问冲突错误)
Crashes when trying to generate multiples of the same process(Access Violation Error)
因此,当我尝试为同一程序创建多个进程时,我在尝试创建第二个子进程时收到访问冲突错误。 (我能够在尝试创建第二个子进程时崩溃之前创建一个子进程)
int main(int argc, char** argv)
{
if (argc > 1 && strcmp(argv[1], "lol")) ThreadFunc();
char key_code;
int i = 0;
STARTUPINFO* si = calloc(1, sizeof(STARTUPINFO));
PROCESS_INFORMATION* pi = calloc(1, sizeof(PROCESS_INFORMATION));
WCHAR** wideArguments = calloc(1, sizeof(wchar_t*));
size_t outSize;
size_t size = strlen(arguments) + 1;
while (1) {
if (_kbhit()) {
key_code = _getch();
if (key_code == 'c') {
i += 10;
si = realloc(si, i * sizeof(STARTUPINFO));
pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
for (int k = 0; k < 10; k++) {
wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
wcscat_s(wideArguments[i + k - 10], 256, L" lol");
int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, 0, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
if (l == 0) printf("\n\n%d\n\n", GetLastError());
}
}
else if (key_code == 'x') {
free(si);
free(pi);
for(int j = 0; j < i;j++) free(wideArguments[j];
free(wideArguments);
exit(0);
}
}
else continue;
}
}
好的,问题是 realloc
没有将内存归零,因此 pi 和 si 中的条目没有被初始化。为了解决这个问题,我们定义了一个 piOriginal
和 siOriginal
用于稍后初始化数组中的条目。
STARTUPINFO siOriginal = { 0 };
PROCESS_INFORMATION piOriginal = { 0 };
并将 'c' 输入后的循环更改为:
if (key_code == 'c') {
i += 10;
si = realloc(si, i * sizeof(STARTUPINFO));
pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
for (int k = 0; k < 10; k++) {
wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
si[k + i - 10] = siOriginal;
pi[k + i - 10] = piOriginal;
GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
wcscat_s(wideArguments[i + k - 10], 256, L" lol");
int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
if (l == 0) printf("\n%d\n", GetLastError());
}
}
因此,当我尝试为同一程序创建多个进程时,我在尝试创建第二个子进程时收到访问冲突错误。 (我能够在尝试创建第二个子进程时崩溃之前创建一个子进程)
int main(int argc, char** argv)
{
if (argc > 1 && strcmp(argv[1], "lol")) ThreadFunc();
char key_code;
int i = 0;
STARTUPINFO* si = calloc(1, sizeof(STARTUPINFO));
PROCESS_INFORMATION* pi = calloc(1, sizeof(PROCESS_INFORMATION));
WCHAR** wideArguments = calloc(1, sizeof(wchar_t*));
size_t outSize;
size_t size = strlen(arguments) + 1;
while (1) {
if (_kbhit()) {
key_code = _getch();
if (key_code == 'c') {
i += 10;
si = realloc(si, i * sizeof(STARTUPINFO));
pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
for (int k = 0; k < 10; k++) {
wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
wcscat_s(wideArguments[i + k - 10], 256, L" lol");
int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, 0, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
if (l == 0) printf("\n\n%d\n\n", GetLastError());
}
}
else if (key_code == 'x') {
free(si);
free(pi);
for(int j = 0; j < i;j++) free(wideArguments[j];
free(wideArguments);
exit(0);
}
}
else continue;
}
}
好的,问题是 realloc
没有将内存归零,因此 pi 和 si 中的条目没有被初始化。为了解决这个问题,我们定义了一个 piOriginal
和 siOriginal
用于稍后初始化数组中的条目。
STARTUPINFO siOriginal = { 0 };
PROCESS_INFORMATION piOriginal = { 0 };
并将 'c' 输入后的循环更改为:
if (key_code == 'c') {
i += 10;
si = realloc(si, i * sizeof(STARTUPINFO));
pi = realloc(pi, i * sizeof(PROCESS_INFORMATION));
wideArguments = realloc(wideArguments, i * sizeof(wchar_t*));
for (int k = 0; k < 10; k++) {
wideArguments[i + k - 10] = calloc(256, sizeof(wchar_t));
si[k + i - 10] = siOriginal;
pi[k + i - 10] = piOriginal;
GetModuleFileName(NULL, wideArguments[i + k - 10], 256);
wcscat_s(wideArguments[i + k - 10], 256, L" lol");
int l = CreateProcess(NULL, wideArguments[i + k - 10], NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si[i + k - 10], &pi[i + k - 10]);
if (l == 0) printf("\n%d\n", GetLastError());
}
}