Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //VERSIONE WINDOWS (A SEGUIRE TROVATE LA VERSIONE PER LINUX)
- import std;
- #include <windows.h>
- auto main() -> int
- {
- STARTUPINFO si{ .cb = sizeof(STARTUPINFO) }; // oppure si.cb = ...
- PROCESS_INFORMATION pi{};
- // tentiamo di creare un processo che esegua il blocco note
- //LINK alla documentazione della funzione: https://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx
- // CreateProcess richiede un wchar_t modificabile
- wchar_t cmd[] { L"notepad.exe" };
- if (!CreateProcess(
- NULL,
- cmd,
- NULL,
- NULL,
- FALSE,
- 0,
- NULL,
- NULL,
- &si,
- &pi)
- )
- {
- std::println("CreateProcess ha fallito. errore: {}", GetLastError());
- return 2;
- }
- std::println("Blocco note lanciato. In attesa della sua terminazione ...");
- // Metti in attesa il processo di esecuzione di questo programma
- // fino al completamento di quello creato (chiusura del blocco note)
- WaitForSingleObject(pi.hProcess, INFINITE);
- // Rilasciamo le risorse attivate per la creazione
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- std::println("Il controllo e` tornato al processo principale!");
- return 0;
- }
- ------------------------------------------------------------------------------------------------------------------------
- //VERSIONE LINUX
- #include <iostream>
- #include <spawn.h>
- #include <sys/wait.h>
- #include <cerrno>
- #include <cstring>
- // Espone le variabili d'ambiente correnti da passare al nuovo processo
- extern char **environ;
- int main()
- {
- pid_t pid; // L'equivalente del pi.hProcess (identificativo del processo)
- // Gli argomenti del comando. Il primo elemento รจ sempre il nome del programma stesso.
- char* argv[] = { (char*)"nano", NULL };
- // posix_spawnp cerca e lancia l'eseguibile incapsulando fork() ed exec() in una sola chiamata
- int status = posix_spawnp(
- &pid, // Output: riceve il PID del nuovo processo
- "nano", // Nome dell'eseguibile da cercare nel PATH
- NULL, // Azioni sui file (es. ridirezione I/O) - NULL per default
- NULL, // Attributi del processo (es. scheduling) - NULL per default
- argv, // Argomenti da linea di comando
- environ // Variabili d'ambiente ereditate
- );
- if (status != 0)
- {
- std::cout << "posix_spawn ha fallito. errore: " << status
- << " (" << strerror(status) << ")" << std::endl;
- return 2;
- }
- std::cout << "Editor lanciato (PID: " << pid << "). In attesa della sua terminazione ..." << std::endl;
- // Mette in attesa il processo di esecuzione di questo programma
- // Equivalente a WaitForSingleObject(pi.hProcess, INFINITE);
- int wait_status;
- waitpid(pid, &wait_status, 0);
- std::cout << "Il controllo e` tornato al processo principale!" << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment