process control

Üdvözlöm, Ön a process control szó jelentését keresi. A DICTIOUS-ban nem csak a process control szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a process control szót egyes és többes számban mondani. Minden, amit a process control szóról tudni kell, itt található. A process control szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Aprocess control és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

process control (tsz. process controls)

  1. (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:

  1. Új folyamat létrehozása (fork(), CreateProcess())
  2. Folyamatok végrehajtása (exec(), system())
  3. Folyamatok vezérlése (pl. várakozás, leállítás, folytatás)
  4. 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, 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! 🚀