Source.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <windows.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. int main() {
  6. system("chcp 1251>null");
  7. FILE* input_file = fopen("C:\\Users\\КузьминИВ\\source\\repos\\projectOnCreateProcess\\infEx\\input.txt", "r");
  8. if (input_file == NULL) {
  9. printf("Файл для извлечения данных не найден.\n");
  10. return 1;
  11. }
  12. float a, b, c;
  13. if (fscanf(input_file, "%f %f %f", &a, &b, &c) != 3) {
  14. printf("Ошибка при чтении коэффициентов\n");
  15. fclose(input_file);
  16. return 1;
  17. }
  18. fclose(input_file);
  19. // Формирование строки командной строки
  20. char cmdArgs[200];
  21. snprintf(cmdArgs, sizeof(cmdArgs),
  22. "C:\\Users\\КузьминИВ\\source\\repos\\projectOnCreateProcess\\x64\\Debug\\projectOnCreateProcess.exe %f %f %f",
  23. a, b, c);
  24. // Создание канала для перенаправления вывода дочернего процесса
  25. HANDLE hReadPipe, hWritePipe;
  26. SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
  27. if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
  28. printf("Не удалось создать канал.\n");
  29. return 1;
  30. }
  31. // Настройка структуры для процесса
  32. STARTUPINFO si;
  33. PROCESS_INFORMATION pi;
  34. ZeroMemory(&si, sizeof(si));
  35. si.cb = sizeof(si);
  36. si.hStdOutput = hWritePipe; // перенаправляем стандартный вывод в канал
  37. si.hStdError = hWritePipe; // перенаправляем стандартный вывод ошибок в канал
  38. si.dwFlags |= STARTF_USESTDHANDLES;
  39. ZeroMemory(&pi, sizeof(pi));
  40. // Создание дочернего процесса
  41. if (!CreateProcessA(
  42. NULL, // Путь указываем в cmdArgs
  43. cmdArgs, // Полный путь с аргументами
  44. NULL,
  45. NULL,
  46. TRUE,
  47. CREATE_NEW_CONSOLE,
  48. NULL,
  49. NULL,
  50. &si,
  51. &pi)) {
  52. printf("Не удалось создать процесс. Код ошибки: %d.\n", GetLastError());
  53. return 1;
  54. }
  55. // Закрываем ненужный конец канала
  56. CloseHandle(hWritePipe);
  57. // Чтение из канала и вывод в основной процесс
  58. char buffer[256];
  59. DWORD bytesRead;
  60. while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead > 0) {
  61. buffer[bytesRead] = '\0'; // завершаем строку
  62. printf("%s", buffer); // выводим данные, полученные от дочернего процесса
  63. }
  64. // Ожидание завершения дочернего процесса
  65. WaitForSingleObject(pi.hProcess, INFINITE);
  66. DWORD childExitCode;
  67. GetExitCodeProcess(pi.hProcess, &childExitCode);
  68. printf("\nКод завершения дочернего процесса %d\n", childExitCode);
  69. // Освобождение ресурсов
  70. CloseHandle(pi.hProcess);
  71. CloseHandle(pi.hThread);
  72. CloseHandle(hReadPipe);
  73. return 0;
  74. }