Tworzenie nowego procesu (programowo). C#, C++, Python

Najpopularniejszym dziś sposobem tworzenia nowego procesu jest odwołanie się do odpowiedniej funkcji, gdzie deklarujemy podstawowe informacje o procesie.  Funkcja zwraca nam potem uchwyt do tego procesu (ang. handle) za pomocą którego możemy na nim operować.

Spróbujmy więc napisać w każdym z trzech wcześniej zadeklarowanych języków (C#, C++, Python) utworzyć małe aplikacje, które będą podstawą do dalszej pracy na procesach.

Zaczniemy od C#. Microsoft udostępnia nam w .NET wiele funkcji, które znacznie przyspieszają naszą pracę. Wymagany kod jest krótki:

using System;
using System.Diagnostics;
namespace proc
{
  class Program
    {
      static void Main(string[] args)
      {
        var p = Process.Start("calc.exe");
        Console.Write("Process {0} started with ID {1)\n",p.ProcessName,p.Id);
        Console.Write("Waiting {0} to exit...\n",p.ProcessName);
        p.WaitForExit();
        Console.Write("Process {0} exited.,p.ProcessName);
        Console.ReadKey();
      }
    }
}

Jego kompilacja i uruchomienie wygląda tak:

Pokaz slajdów wymaga JavaScript.

Jak widać wszystko działa jak powinno. Teraz przejdziemy do Pythona. Wykorzystamy bibliotekę subprocess:

import subprocess
print "File to run:",
x = raw_input()
y = subprocess.Popen(x)
print "Process started with ID %u" % y.pid
y.wait()
print "Process exited"

Wykonany skrypt prezentuje się tak:

Pokaz slajdów wymaga JavaScript.

Działa! Teraz przejdziemy do C++. Wykorzystamy w nim funkcję WinAPI (windows.h) CreateProcess (funkcja ta przyjmuje bardzo dużo parametrów, z czego potrzebne jest nam tylko kilka).

#include <windows.h>
#include <stdio.h>
int main(void)
{
    PROCESS_INFORMATION pInfo;
    STARTUPINFO sInfo = { sizeof(pInfo) };

    BOOL res = CreateProcess(NULL,"C:\\Windows\\System32\\calc.exe", NULL, NULL, FALSE, NULL, NULL, NULL, &sInfo, &pInfo);
    if (!res) return 1;
    CloseHandle(pInfo.hThread);
    printf("Process started with ID: %u, waiting for exit...\n", static_cast<unsigned int>(pInfo.dwProcessId));
    WaitForSingleObject(pInfo.hProcess, INFINITE);
    CloseHandle(pInfo.hProcess);
    puts("Process exited");
    return 0;
}

Przeanalizujmy kod linijka po linijce. Pierwsze dwie, są to dwie dobrze nam znane zaimportowane biblioteki – standardowa (stdio.h / cstdio) oraz WinAPI (windows.h).
Tworzymy główną część naszego programu (int main) bez żadnych parametrów (void).
Teraz tworzymy dwa obiekty  PROCESS_INFORMATION oraz STARTUPINFO – potrzebne są one nam do uruchamiania nowego procesu.
Potem  widzimy zmienną logiczną BOOL nazwaną res  – służy ona do sprawdzenia, czy uruchomienie procesu się powiodło (CreateProcessW również jest typem BOOL). Jeżeli zwróci on wartość TRUE – kontynnujmy, inaczej return 1.

Przeanalizujmy teraz strukturę CreateProcess. Ma ona, jak to wiele komend z WinAPI, wiele parametrów, w większości niepotrzebnych. Najważniejsze dla nas są:

  • lpApplicationName – ścieżka do uruchamianej aplikacji
  • lpCommandLine – jak ta aplikacja ma być wywoływana z lini komend
  • lpStartupInfo – zawiera parametry nowego procesu
  • lpProcessInformation – zawiera informacje o nowym procesie i uchwyty (Handle) do niego

Po uruchomieniu pliku możemy zacząć zamykać uchwyty. Służy do tego funkcja CloseHandle, w której zamykamy dostęp do wątku (nie ingerujemy w niego). Kolejna linijka służy do „wyczekiwania” przez nieskończoną ilość czasu  na zamknięcie procesu. Kiedy już się to zdarzy, całkowicie zamykamy uchwyt. Wypisujemy potem na konsoli „Process exited” i zwracamy wartość (tu 0).
Kompilacja i uruchomienie (TDM-GCC 4.9.2 32-bit DEBUG) wygląda tak:

Pokaz slajdów wymaga JavaScript.

To by było na tyle. Jeżeli macie jakieś pytania – śmiało komentujcie. Pozdrawiam :3

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s