From 940781265f484f3aff89712804f201169373b036 Mon Sep 17 00:00:00 2001 From: matv864 Date: Thu, 9 Jan 2025 21:56:58 +1000 Subject: [PATCH] first program --- .gitignore | 1 + .vscode/tasks.json | 28 ++++++++++++++++ main.cpp | 8 ----- process_launcher.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++ process_launcher.h | 34 +++++++++++++++++++ test.cpp | 29 +++++++++++++++++ test.exe | Bin 0 -> 49496 bytes 7 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/tasks.json delete mode 100644 main.cpp create mode 100644 process_launcher.cpp create mode 100644 process_launcher.h create mode 100644 test.cpp create mode 100644 test.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4083906 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_trash/ \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..6a85229 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe build active file", + "command": "C:\\MinGW\\bin\\g++.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/main.cpp b/main.cpp deleted file mode 100644 index fde39b7..0000000 --- a/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include -using namespace std; - -int main(){ - cout << "Hello World"; - - return 0; -} \ No newline at end of file diff --git a/process_launcher.cpp b/process_launcher.cpp new file mode 100644 index 0000000..09bdaed --- /dev/null +++ b/process_launcher.cpp @@ -0,0 +1,76 @@ +#include "process_launcher.h" +#include + +#ifdef _WIN32 + +// Для Windows используем CreateProcess +int ProcessLauncher::launch(const std::string& command) { + return launchWindows(command); +} + +int ProcessLauncher::launchWindows(const std::string& command) { + STARTUPINFO si = { sizeof(STARTUPINFO) }; + PROCESS_INFORMATION pi; + if (!CreateProcess(NULL, const_cast(command.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + std::cerr << "Ошибка запуска процесса: " << GetLastError() << std::endl; + return -1; + } + + return pi.dwProcessId; // Возвращаем PID процесса +} + +int ProcessLauncher::waitForProcess(int pid) { + return waitForProcessWindows((HANDLE)pid); +} + +int ProcessLauncher::waitForProcessWindows(HANDLE processHandle) { + DWORD exitCode; + WaitForSingleObject(processHandle, INFINITE); + if (GetExitCodeProcess(processHandle, &exitCode)) { + return exitCode; + } + return -1; +} + +#else + +// Для UNIX-подобных систем используем fork и exec +int ProcessLauncher::launch(const std::string& command) { + return launchUnix(command); +} + +int ProcessLauncher::launchUnix(const std::string& command) { + pid_t pid = fork(); + if (pid == -1) { + std::cerr << "Ошибка fork" << std::endl; + return -1; + } + + if (pid == 0) { // Дочерний процесс + execlp(command.c_str(), command.c_str(), (char*)NULL); + // Если execlp вернул, значит произошла ошибка + std::cerr << "Ошибка запуска команды: " << command << std::endl; + exit(-1); + } + + return pid; // Возвращаем PID процесса +} + +int ProcessLauncher::waitForProcess(int pid) { + return waitForProcessUnix(pid); +} + +int ProcessLauncher::waitForProcessUnix(pid_t pid) { + int status; + if (waitpid(pid, &status, 0) == -1) { + std::cerr << "Ошибка ожидания процесса" << std::endl; + return -1; + } + + if (WIFEXITED(status)) { + return WEXITSTATUS(status); // Возвращаем код завершения процесса + } + return -1; +} + +#endif \ No newline at end of file diff --git a/process_launcher.h b/process_launcher.h new file mode 100644 index 0000000..701933f --- /dev/null +++ b/process_launcher.h @@ -0,0 +1,34 @@ +#ifndef PROCESS_LAUNCHER_H +#define PROCESS_LAUNCHER_H + +#ifdef _WIN32 + #include +#else + #include + #include + #include +#endif + +#include + +class ProcessLauncher { +public: + // Запуск программы в фоновом режиме + static int launch(const std::string& command); + + // Ожидание завершения процесса и получение его кода возврата + static int waitForProcess(int pid); + +private: +#ifdef _WIN32 + // Для Windows + static int launchWindows(const std::string& command); + static int waitForProcessWindows(HANDLE processHandle); +#else + // Для UNIX-подобных систем + static int launchUnix(const std::string& command); + static int waitForProcessUnix(pid_t pid); +#endif +}; + +#endif // PROCESS_LAUNCHER_H \ No newline at end of file diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000..4f529b2 --- /dev/null +++ b/test.cpp @@ -0,0 +1,29 @@ +#include "process_launcher.h" +#include +#include + +int main() { + std::string command; + + // В зависимости от ОС, выберем команду для запуска +#ifdef _WIN32 + command = "cmd /C echo Hello, World!"; +#else + command = "echo Hello, World!"; +#endif + + // Запускаем процесс + int pid = ProcessLauncher::launch(command); + if (pid == -1) { + std::cerr << "Не удалось запустить процесс." << std::endl; + return -1; + } + + std::cout << "Процесс с PID: " << pid << " запущен." << std::endl; + + // Ожидаем завершения процесса + int exitCode = ProcessLauncher::waitForProcess(pid); + std::cout << "Процесс завершился с кодом: " << exitCode << std::endl; + + return 0; +} \ No newline at end of file diff --git a/test.exe b/test.exe new file mode 100644 index 0000000000000000000000000000000000000000..080a4afa21dbe52c9389db85ea1839e329efbb4a GIT binary patch literal 49496 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 X)&6y)eZ~xTTx-gE12J2U;;jE0s9S-A literal 0 HcmV?d00001