process control (tsz. process controls)
A folyamatvezérlés (process control) C++ nyelven azt jelenti, hogy a program képes kezelni a különböző folyamatokat (processzeket) és azok állapotait. A folyamatvezérlés főbb területei:
fork()
, CreateProcess()
)exec()
, system()
)A C++ önmagában nem biztosít beépített támogatást a folyamatok vezérléséhez, de a POSIX (Linux/Mac) és Windows API-k segítségével lehetőség van folyamatok létrehozására és kezelésére.
Az operációs rendszertől függően a folyamatok létrehozására két fő megoldás van:
Operációs rendszer | Függvény |
---|---|
Linux/macOS (POSIX) | fork()
|
Windows | CreateProcess()
|
fork()
)A fork()
rendszerhívás egy új folyamatot hoz létre a szülőfolyamatból.
#include <iostream>
#include <unistd.h> // fork()
using namespace std;
int main() {
pid_t pid = fork();
if (pid < 0) {
cerr << "Hiba a fork során!" << endl;
} else if (pid == 0) {
cout << "Ez a gyerekfolyamat. PID: " << getpid() << endl;
} else {
cout << "Ez a szülőfolyamat. Gyerek PID: " << pid << endl;
}
return 0;
}
📌 Magyarázat:
- A fork()
egy új folyamatot hoz létre, amely a szülőfolyamat másolata. - A fork()
kétszer tér vissza: - Gyerekfolyamatban pid == 0
- Szülőfolyamatban pid > 0
(a gyerekfolyamat PID-je) - Ha a fork()
sikertelen, pid < 0
.
CreateProcess()
)Windows rendszeren a CreateProcess()
függvényt kell használni.
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
if (CreateProcess(
"C:\\Windows\\System32\\notepad.exe", // Futtatandó program
NULL, NULL, NULL, FALSE,
0, NULL, NULL, &si, &pi)) {
cout << "Folyamat elindítva. PID: " << pi.dwProcessId << endl;
WaitForSingleObject(pi.hProcess, INFINITE); // Megvárjuk, míg befejeződik
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
} else {
cout << "Nem sikerült létrehozni a folyamatot!" << endl;
}
return 0;
}
📌 Magyarázat: - A CreateProcess()
egy új folyamatot indít (notepad.exe
). - A WaitForSingleObject()
függvény megvárja, amíg a folyamat befejeződik. - A CloseHandle()
bezárja a processz és thread handle-ket.
exec()
, system()
)Egy másik program végrehajtása a exec()
(Linux) vagy system()
(mindkét OS) segítségével történik.
exec()
használata (Linux/macOS)Az exec()
függvények egy új programot töltenek be egy folyamat helyére.
#include <iostream>
#include <unistd.h> // exec
using namespace std;
int main() {
char* args = {"/bin/ls", "-l", NULL}; // Program és argumentumok
execvp(args, args); // Futtatjuk az 'ls -l' parancsot
cout << "Ez a sor sosem fut le!" << endl; // Mert az exec lecseréli a folyamatot
return 0;
}
📌 Magyarázat: - Az execvp()
lecseréli a jelenlegi folyamatot egy másik programmal (ls -l
). - Ha az exec()
sikeres, az eredeti program nem folytatódik!
system()
használata (Linux és Windows)A system()
egy egyszerű módszer más programok futtatására.
#include <iostream>
#include <cstdlib> // system()
using namespace std;
int main() {
system("ls -l"); // Linux/macOS: listázza a fájlokat
system("dir"); // Windows: listázza a fájlokat
return 0;
}
📌 Megjegyzés:
- Egyszerű, de nem biztonságos – függ az operációs rendszer shell-jétől.
A szülőfolyamat gyakran vár a gyerekfolyamat befejeződésére.
wait()
és waitpid()
(Linux/macOS)#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main() {
pid_t pid = fork();
if (pid == 0) {
cout << "Gyerekfolyamat, várok 5 másodpercet..." << endl;
sleep(5);
} else {
int status;
waitpid(pid, &status, 0); // Várakozás a gyerekfolyamatra
cout << "Szülő: Gyerekfolyamat befejeződött." << endl;
}
return 0;
}
📌 Megjegyzés:
- waitpid()
megvárja a gyerekfolyamat befejeződését.
TerminateProcess()
(Windows)Windows alatt egy folyamat leállítása így történik:
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
if (CreateProcess("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
cout << "Notepad elindítva!" << endl;
Sleep(5000); // 5 másodperc várakozás
TerminateProcess(pi.hProcess, 0); // Leállítás
cout << "Notepad leállítva!" << endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
return 0;
}
📌 Megjegyzés:
- TerminateProcess()
leállítja a folyamatot.
Művelet | Linux/macOS | Windows |
---|---|---|
Új folyamat létrehozása | fork()
|
CreateProcess()
|
Más program indítása | execvp()
|
CreateProcess()
|
Parancs futtatása | system()
|
system()
|
Várakozás folyamatra | waitpid()
|
WaitForSingleObject()
|
Folyamat leállítása | kill(pid, SIGTERM)
|
TerminateProcess()
|
✅ Melyiket válaszd?
- Ha Linux/macOS, akkor fork()
, execvp()
és waitpid()
.
- Ha Windows, akkor CreateProcess()
, WaitForSingleObject()
.
C++ folyamatvezérlése erőteljes és rugalmas, de függ az operációs rendszertől! 🚀