Staňte se programátorem: Jak na C# pod Linuxem II.

Microsoft .NET Framework je dnes již k dispozici i na Linuxu. Projekt se jmenuje Mono a s pomocí GTK nebo Windows Forms tak můžete v C# psát multiplatformní aplikace.

V minulém díle jste si s námi mohli vytvořit program – správce procesů, napsaný v jazyce C# pro operační systém Linux. Platforma .NET je sice nativně vytvořena pro operační systém Windows, avšak pro Linux existuje jeho klon s názvem Mono ve vývojovém prostředí MonoDevelop. Ukázali jsme si práci s ovládacími prvky knihovny GTK, na které je mimochodem založen visuální prostředí GNOME.

Na prvním projektu jsme si ukázali základní práci, dnes se k němu vrátíme, popíšeme si ale naopak kód, pomocí kterého jsme zjistili systémové proměnné a některé běžící procesy.

V dnešním díle si ukážeme:

  • Práce s procesy
  • Výpis systémových proměnných
task_manager_informace.png  taskmanager_procesy.png
Dialog s výpisem informací o systému a související spuštěné procesy

Systémové proměnné

Systémové proměnné jsou takové proměnné, ke kterým má každá aplikace přístup. Systémové proměnné většinou obsahují cesty k souborům či složkám, informace o uživateli, systému či hardwaru. V jazyce C# se k systémovým proměnným nejjednodušeji dostaneme pomocí metody GetEnvironmentVariables třídy System.Environment, která vrací instanci třídy System.Collections.IDictionary. Tato třída slouží jako slovník – obsahuje uspořádané dvojice ve tvaru klíč – hodnota (analogie k asociativnímu poli v PHP aj.). K procházení jednotlivých uspořádaných dvojic použijeme cyklus foreach. Tyto dvojice jsou představovány třídou DictionaryEntry. Ke zjištění klíče použijeme vlastnost Key. Pro zjištění hodnoty, jež náleží tomuto klíči, použijeme vlastnost Value.

IDictionary promenne = Environment.GetEnvironmentVariables();

foreach (DictionaryEntry de in promenne)
{
    // Vloží název systémové proměnné do komponenty typu ComboBoxEntry
    this.comboboxentry1.AppendText(de.Key.ToString());
}

Pro získání hodnoty určité systémové proměnné, použijeme metodu GetEnvironmentVariable třídy Environment, která jako argument očekává název proměnné, jež má být vrácena.

this.label5.Text = "Hodnota: " + 
                                              Environment.GetEnvironmentVariable(this.comboboxentry1.ActiveText);

Práce s procesy

Každý proces systému je představován třídou System.Diagnostics.Process.

Pro získání pole procesů slouží metoda GetProcesses třídy Process. Chceme-li ve Windows ukončit určitý proces (jehož jméno zjistíme vlastností ProcessName), použijeme metodu Kill.

foreach(Process p in Process.GetProcesses())
{
    // Ukončí poznámkový blok
    if (p.ProcessName == “notepad“)
    {
        p.Kill();
        break;
    }
}

Jelikož ne všechny třídy obsažené v platformě Mono jsou kompletní, metoda Kill nefunguje. K ukončení procesu tedy musíme použít jiný způsob – tím je použití statické metody kill třídy Mono.Unix.Native.Syscall. Tato metoda jako svůj argument očekává tzv. PID, což je neduplicitní číslo, pod kterým se každý proces v systému identifikován. Druhým argumentem je položka výčtového typu Mono.Unix.Native.Signum.SIGKILL představující signál, kterým bude proces ukončen.

MyTreeNode vybranaPol;

// Projde jednotlivé běžící procesy
foreach(Process p in Process.GetProcesses())
{
    // Identifikuje vybraný proces
    if (p.ProcessName == vybranaPol.NazevProcesu)
    {
        // Ukončí proces sygnálem SIGKILL
        Mono.Unix.Native.Syscall.kill(p.Id,Mono.Unix.Native.Signum.SIGKILL);
        ns.RemoveNode(vybranaPol);
        break;
    }
}

Pro spuštění procesu složí statická přetížená metoda Start třídy Process, které můžeme dosadit jeden či dva řetězce – argumenty. Chceme-li spustit proces bez parametrů, dosadíme jako argument řetězec představující cestu k aplikaci, jež má být spuštěna.

Process.Start(“firefox“);

Chceme-li spustit aplikaci s parametry, použijeme je jako druhý argument:

Process.Start(“firefox“,“google.com“);

Pro nastavení priority procesu použijeme vlastnost PriorityClass třídy Process, které přiřadíme položku výčtového typu ProcessPriorityClass představující nastavovanou úroveň priority procesu.

// Projde jednotlivé procesy
foreach(Process p in Process.GetProcesses())
{
    // Vybere proces jehož jméno je shodné s jménem
    // vybraným ve komponentě NodeView
    if (p.ProcessName == “nějaký proces“)
    {
        // Nastaví prioritu
        if (this.comboboxentry1.ActiveText == "Nečinný")
            p.PriorityClass = ProcessPriorityClass.Idle;
       
else if(this.comboboxentry1.ActiveText == "Podprůměrná")
            p.PriorityClass = ProcessPriorityClass.BelowNormal;
        else if(this.comboboxentry1.ActiveText == "Průměrná")
            p.PriorityClass = ProcessPriorityClass.Normal;
        else if(this.comboboxentry1.ActiveText == "Nadprůměrná")
            p.PriorityClass = ProcessPriorityClass.AboveNormal;
        else if(this.comboboxentry1.ActiveText == "Vysoká")
            p.PriorityClass = ProcessPriorityClass.High;
        else if(this.comboboxentry1.ActiveText == "Nejvyšší")
            p.PriorityClass = ProcessPriorityClass.RealTime;
    }
)

Multiplatformní .NET

Práce se systémovými proměnnými a procesy v .NET knihovně se napříč systémy příliš neliší, pokud tedy už máte s C# určité zkušenosti, práce na Linuxu by pro vás neměla být nikterak velikým překvapením – přestože Mono ještě není zcela funkční a kompatibilní. A platí to i o vývojovém prostředí, v každé moderní linuxové distribuci stačí z oficiálního repozitáře nainstalovat program MonoDevelop, který díky knihovně Gtk# nabízí i prostředí pro návrh vizuálních aplikací.

monodevelop_kod.png  monodevelop_ui.png
Vývojové prostředí MonoDevelop se příliš neliší od standardu Visual Studia nebo SharpDevelopu

Nakonec opět přikládáme projekt pro MonoDevelop a spustitelný program pro linuxovou platformu. Ke spuštění programu budete potřebovat běhové prostředí Mono. Program má sice příponu *.exe, z terminálu jej ale můžete spustit třeba příkazem: mono TaskManagerProgram.exe.

Diskuze (14) Další článek: Stárnoucí Britannica se omezeně otvírá komunitě

Témata článku: , , , , , , , , , , , , ,