process control
Főnév
process control (tsz. process controls)
- (informatika) ?
Folyamatvezérlés (Process Control) C++ nyelven
Bevezetés
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:
- Új folyamat létrehozása (
fork(),CreateProcess()) - Folyamatok végrehajtása (
exec(),system()) - Folyamatok vezérlése (pl. várakozás, leállítás, folytatás)
- Folyamatok közötti kommunikáció (IPC)
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.
1. Folyamatok létrehozása
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() |
1.1. Új folyamat létrehozása Linux/macOS rendszeren (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.
1.2. Új folyamat létrehozása Windows rendszeren (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.
2. Más program futtatása (exec(), system())
Egy másik program végrehajtása a exec() (Linux) vagy system() (mindkét OS) segítségével történik.
2.1. 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[0], 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!
2.2. 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.
3. Folyamatvezérlés (Várakozás és leállítás)
A szülőfolyamat gyakran vár a gyerekfolyamat befejeződésére.
3.1. 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.
3.2. 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.
Összegzés
| 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! 🚀
- process control - Szótár.net (en-hu)
- process control - Sztaki (en-hu)
- process control - Merriam–Webster
- process control - Cambridge
- process control - WordNet
- process control - Яндекс (en-ru)
- process control - Google (en-hu)
- process control - Wikidata
- process control - Wikipédia (angol)