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
Klepněte pro větší obrázek  Klepněte pro větší obrázek
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í.

Klepněte pro větší obrázek  Klepněte pro větší obrázek
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.

Témata článku: Software, Programování, Linux

14 komentářů

Nejnovější komentáře

  • Mi.Chal 27. 1. 2009 21:25:15
    Ono dost zalezi na tom, co je to za projekt. Kdyz neco delas pro zakaznika...
  • Michal Smrž 26. 1. 2009 16:32:35
    Tak Windows.Forms nepovažuji za důležitou součást mona (má GTK#), ale s...
  • tucekj 26. 1. 2009 11:58:11
    No, zkuste si napsat malé řecké omega na klávesnici… Pokud řecký znak není...
Určitě si přečtěte

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

** Programátorů je málo a horníků bez práce po uzavření dolu Paskov bude moc ** Problém řeší unikátní projekt ** Pilotní kurz dává naději, že by z horníků mohli být použitelní kodéři

28.  11.  2016 | David Polesný | 78

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

** Novinka od Asusu míří přímo proti MacBooku od Applu ** Nabídne daleko více výkonu za stejné peníze

2.  12.  2016 | David Polesný | 119