Programování v Linuxu

Transkript

Programování v Linuxu
Programování v Linuxu
Ondřej Vondrouš
Autor: Ondřej Vondrouš
Název díla: Programování v Linuxu
Zpracoval(a): České vysoké učení technické v Praze
Fakulta elektrotechnická
Kontaktní adresa: Technická 2, Praha 6
Inovace předmětů a studijních materiálů pro
e-learningovou výuku v prezenční a kombinované
formě studia
Evropský sociální fond
Praha & EU: Investujeme do vaší budoucnosti
VYSVĚTLIVKY
Definice
Zajímavost
Poznámka
Příklad
Shrnutí
Výhody
Nevýhody
ANOTACE
Cílem tohoto modulu je seznámit čtenáře s možnostmi tvorby vlastních programů a skriptů
v Operačním systému Linux.
CÍLE
Po přečtení tohoto modulu by čtenář měl být schopen rozlišit skripty a programy. Čtenář by se
měl seznámit se seznamem základních linuxových nástrojů. Dále by si čtenář měl osvojit
práci se standardním vstupem a výstupem a možnostmi jeho přesměrování, včetně využití
rour ( | pipe). V části zaměřené na programování, bude ukázána řada nástrojů, která slouží pro
usnadnění práce s vývojem a distribucí vlastních programů. Zvláštní pozornost bude
věnována balíku nástrojů GNU toolchain.
LITERATURA
[1]
Michael, Randal. Mastering UNIX Shell Scripting. : WILEY, 2008. 1002. ISBN 978-0470-18301-4.
[2]
Larry, Wall. Tom, Christiansen. Randal L., Schwartz. Programování v jazyce Perl. :
Computer Press, 1997, 683. ISBN 80-85896-95-8.
[3]
Keir, Davis. John, W.,Turner. Nathan, Yocom. The Definitive Guide to Linux Network
Programming. . : Apress, 2004, 374. ISBN 1-59059-322-7.
[4]
Peter,Norton. Harley, Hahn. Průvodce Unixem. : Unis Publishing,1993. 562. ISBN 0553-35260-1.
Obsah
1 Programování v Linuxu – Začínáme .................................................................................. 7
1.1
Motivace ..................................................................................................................... 7
1.2
Skript vs. Program ...................................................................................................... 9
1.3
Skriptovací jazyky .................................................................................................... 11
1.4
Programovací jazyky ................................................................................................ 14
1.5
Vývojová prostředí ................................................................................................... 15
1.6
Shrnutí ...................................................................................................................... 17
1.7
Ověření znalostí ........................................................................................................ 18
2 Programování v Linuxu – Skripty .................................................................................... 19
2.1
Úvod ......................................................................................................................... 19
2.2
Nástroje .................................................................................................................... 20
2.3
SH/BASH ................................................................................................................. 22
2.4
AWK ........................................................................................................................ 24
2.5
PERL ........................................................................................................................ 25
2.6
Python ....................................................................................................................... 27
2.7
Shrnutí ...................................................................................................................... 28
2.8
Ověření znalostí ........................................................................................................ 30
3 Programování v Linuxu – Programy ............................................................................... 31
3.1
Úvod ......................................................................................................................... 31
3.2
Nástroje – GNU toolchain ........................................................................................ 32
3.3
Nástroje – GCC ........................................................................................................ 33
3.4
Nástroje – make ........................................................................................................ 34
3.5
Nástroje – GNU Binutils .......................................................................................... 35
3.6
Nástroje – GDB ........................................................................................................ 36
3.7
Nástroje – autotools .................................................................................................. 37
3.8
Nástroje – configure / make / make install ............................................................... 38
3.9
Ověření znalostí ........................................................................................................ 39
4 Programování v Linuxu – Co se jinam nevešlo ............................................................... 40
4.1
Další možnosti ladění programů – valgrind, a electric fence, .................................. 40
4.2
Služby – démoni ....................................................................................................... 43
4.3
Automatické spouštění a plánování .......................................................................... 45
4.4
Automatické spouštění a plánování - at ................................................................... 46
4.5
Automatické spouštění a plánování - cron ............................................................... 47
4.6
Shrnutí ...................................................................................................................... 48
4.7
Ověření znalostí ........................................................................................................ 49
5 Přestávka ............................................................................................................................. 50
6 Programování v Linuxu – závěrečné cvičení ................................................................... 51
6.1
Test ........................................................................................................................... 51
1 Programování v Linuxu – Začínáme
1.1 Motivace
Tento modul si klade za cíl přiblížit čtenářům možnosti programování a psaní
skriptů na platformě Linux. Hlavní motivací studentů pro zvládnutí látky
obsažené v tomto modulu by měl být fakt, že řadu programátorských úkolů může
být velmi snadné vyřešit, pokud se zvolí vhodný postup pro řešení konkrétní
problematiky. Vhodný postup v tomto případě bude znamenat, udělat to správné
rozhodnutí, kdy použít některého ze skriptovacích jazyků a kdy zase naopak
použít programování ve vyšším programovacím jazyce s použitím vhodných
podpůrných nástrojů.
Zvolení správného přístupu k řešení problému má pozitivní vliv na zvládnutí
jakéhokoliv problému. To co jednou metodou programování může být jen obtížně
dosažitelné a kde řešení zabere programátorovi několik hodin, tak použitím
odlišné metody může být daný problém vyřešen třeba během několika minut.
Předpokládá se, že řada čtenářů se již setkala s programováním v jednom
z klasických programovacích jazyků typu C/C++ a nebo JAVA. To, že se čtenář
seznámí s možnostmi psaní skriptů a obecně možnostmi skriptovacích jazyků,
může mít do budoucna velký vliv na urychlení vývoje při řešení specifických
úkolů. A to vzhledem k faktu, že se mu rozšíří paleta použitelných technologií pro
řešení programátorských problémů.
Proč se zabývat programováním v Linuxu? Dalo by se jednoduše říci, že
programování na platformě Linux se v ledasčem moc neliší od programování na
jiných platformách a na druhou stranu v některých aspektech se liší zcela zásadně.
To zásadní je především to, že platforma Linux je přímo jakoby stvořená pro
programování. Pokud si nainstalujete některou z distribucí Linuxu, budete mít již
v základu k dispozici potřebné kompilátory, debugery, iterpretery skriptů
a vývojová prostředí.
O čem tento modul je.
Tento modul se snaží čtenáři vysvětlit rozdíly mezi skripty a programy. V modulu
bude čtenář seznámen se základním přehledem skriptovacích jazyků používaných
na platformě Linux a budou zde vysvětleny jejich přednosti a nedostatky. V sekci
věnovanou programování ve vyšších programovacích jazycích bude čtenář
seznámen s nástroji z balíku GNU toolchain. Budou také prezentovány některé
techniky jako například jakým způsobem vytvořit daemona (službu) a jakým
způsobem plánovat spouštění úloh v daný čas.
O čem tento modul není.
Ačkoli by k tomu mohl svádět název modulu, tak tento modul není
o programování jako takovém. Nebudou zde vysvětlovány žádné základy
programování a algoritmizace. Naopak se předpokládá, že čtenář již alespoň
částečně ovládá programování v některém z vyšších programovacích jazyků.
Ukázky příkladů zde slouží především pro demonstraci konkrétních vlastností
a ne jako ukázka nejlepšího možného postupu při řešení problému.
Modul se také zcela záměrně vyhýbá tématice skriptovacích jazyků pro WWW,
ale zaměřuje se na systémové skripty a to i přes to, že použité skriptovací jazyky
jsou velmi univerzální a je možné se s nimi setkat velmi často i ve webových
aplikacích.
8
1.2 Skript vs. Program
V této části textu si vysvětlíme rozdíl mezi programem a skriptem. Rozdělení je
možné pojmout z řady úhlů pohledu. Pokud se na danou problematiku podíváme
z pohledu výkonu, budou většinou vítězit klasické programy překládané do
spustitelné binární podoby. Pokud se na věc podíváme z pohledu rychlosti vývoje,
zjistíme, že velkou řada problémů lze řešit velice elegantně a rychle na úrovni
skriptů, byť za cenu pomalejšího zpracování. To ovšem bývá bohatě nahrazeno
velkou rychlostí implementace
Dále je nutné si uvědomit, že zatímco program se překládá pouze jednou
a následně se provádí zkompilovaný kód programu, tak v případě skriptů je skript
interpretován vždy znovu a znovu ve své zdrojové formě. To ovšem není vždy na
překážku, u skriptů není nutné je po jejich změně rekompilovat, ale je možné je
ihned spouštět.
Pokud jde něco programem udělat velmi jednoduše, lze to samé v řadě případů
udělat pomocí skriptu ještě jednodušeji a hlavně rychleji.
Kdy zvolit ten který postup závisí na tom čeho je potřeba dosáhnout. A to by si
měl každý velmi dobře uvědomovat již v době návrhu řešení. Špatný postup sice
a priori nevede k selhání, ale bývá mnohem pracnější, složitější na implementaci.
Z toho také vyplývá i větší náchylnost na výskyt chyb.
Uvažujme vcelku standardní situaci, kterou musí řešit běžný administrátor
serverů. Potřebujeme zjistit, kolikrát denně se nám někdo cizí pokouší připojit na
náš poštovní server, intuitivně asi tušíte, že psát kvůli tomu program je příliš
těžkopádné. Zvláště když si později ukážeme, že se tento problém dá vyřešit
velice elegantně na několika řádcích skriptu a to zcela pomíjím fakt, že daný
skript by se dal zapsat do jediného řádku! Ukázku takového skriptu si ukážeme
v dalším textu a to hned v několika skriptovacích jazycích.
Budeme-li uvažovat jiný problém a to realizaci nějaké síťové služby, kde bude
zásadní výkon. Bude potřeba napsat efektivní a robustní program, bude asi
nejlepší použít nějaký vyšší programovací jazyk. I když i zde jsou možnosti jak
vytvářet síťově služby na úrovni skriptovacích jazyků.
Pokud se podíváme na skripty a programy z dalšího úhlu, tak další velká
rozdílnost spočívá ve formě použitých příkazu. Zatímco při programování
převládá volání interních příkazů daného programovacího jazyka a systémová
volání se používají minimálně, tak v případě psaní skriptů je situace v některých
případech diametrálně odlišná. Jedná se typicky o případ psaní skriptů pro
SHELL, kdy se z velké části využívají malé obslužné programy, které jsou
součástí Linuxových distribucí.
Značnou pozornost si také zaslouží způsob definice proměnných. Zde je rozdíl na
první pohled velmi markantní. Na jedné straně stojí vyšší programovací jazyky se
9
silnou typovou kontrolou. Při deklaraci proměnných je třeba zvolit požadovaný
typ proměnné a následný přístup k dané proměnné je tímto předurčen. Kdežto
v případě skriptovacích jazyků je situace naprosto odlišná. Proměnné je sice třeba
v některých skriptovacích jazycích deklarovat, ale datových typů bývá výrazně
méně. Také vzhledem k absenci překladu dochází ke kontrole datových typů až
během běhu programu.
Některá jazyky třeba jako například PERL přistupují k proměnné dle toho, jak je
na proměnnou odkazováno.
Pokud se zaměříme například na práci s datovým typem pole v jazyce PERL, pak
dostáváme následující výsledky.
Symbol @ značí datový typ pole a symbol $ značí skalární proměnnou. Jak vidno
PERL přistupuje k definici typů proměnných velmi benevolentně.
1
@pole=(”A”,”B”,”C”,”D”,”E”);
#přiřazení položek seznamu do
pole.
2
@var=@pole[0,2];
#vytvoření pouze části pole.
3
$var=@pole;
#ve $var bude uložena velikost
daného pole.
4
$var=$pole[2];
#ve $var bude uložena hodnota
”C”.
5
my ($var1,$var2,$var3)=@pole; #do jednotlivých proměnných se
uloží jednotlivé položky pole.
Jak vidíte na uvedeném příkladu, možností jak pracovat s datovým typem pole je
celá řada. Za povšimnutí stojí především třetí řádek, kde je pěkně vidět, že pokud
má být výsledkem operace skalární hodnota, tak interpret jazyka změní přístup
k datovému typu pole a do proměnné uloží jeho velikost, což je jediná skalární
hodnota, kterou může daná operace vrátit. Stranou samozřejmě zůstává přímý
přístup na položku pole, viz řádek číslo 4. To je samozřejmě také operace, která
vrací skalární hodnotu, v tomto případě se ovšem neodkazujeme na datový typ
pole, ale pouze na konkrétní položku daného pole.
10
1.3 Skriptovací jazyky
Jazyků, které je možné použít k tvorbě skriptů na platformě Linux je celá řada. Při
jejich výběru bude záležet především na tom, co bude vašim cílem a jak elegantně
budeme chtít daného cíle dosáhnout.
Mezi typické zástupce skriptovacích jazyků je možné zařadit: PERL, Python,
PHP, Ruby, SHELLy SH/BASH, AWK, a případně celou řádku další
interpretovaných jazyků.
Je dobré si uvědomit, že skriptovací jazyky lze velmi dobře kombinovat.
Při tvorbě skriptu můžete velmi jednoduše volat pro jednotlivé podúlohy jiné
skripty psané jinými skriptovacími jazyky. Stejně tak jsou například SHELLové
skripty založené na volání rozličných dílčích jednoúčelových programů.
Jednotlivé skripty nebo programy je také možné řetězit do složitějších celků a to
tak, že standardní výstup jednoho propojíme se standardním vstupem
následujícího.
Mějme situaci, kdy chceme otestovat internetové spojení, ale nemáme dostatek
času čekat na výsledek. Tak spustíme test a necháme si výsledek poslat emailem.
nohup ping www.nic.cz –c 5000 | tail –n
[email protected] [mailto:[email protected]]
4
| mail
–s
“Test“
„nohup” – zajistí, aby program běžel i po ukončení terminálu
„ping“ – program ping pro testování odezvy pomocí protokolu ICMP
„tail“ program který vypíše na výstup požadovaný počet řádku ze vstupu
„mail“ program který dokáže odeslat email
Jak si můžete všimnout, vše se dá vyřešit elegantně jedinou příkazovou řádkou.
To, že je možné takovéto problémy řešit takto elegantně umožňuje ta skutečnost,
že je možné přesměrovat standardní výstup jednoho programu na standardní vstup
dalšího. To se v OS Unixového typu dělá pomocí operátoru PIPE (roura) v zápisu
příkazu/skriptu se s ním setkáváme nejčastěji ve formě znaku „|”
Ve výše uvedeném příkladu můžete vidět kombinaci hned 4 různých programů,
které ve formě jediného příkazového řádku splní vaše požadavky. V tomto
případě se vlastně nejedná ani o skutečný skript. Nicméně na příkladu je krásně
vidět celá filosofie psaní skriptů a to dělat věci co nejjednodušší a nejefektivnější.
PIPE (roura) reprezentovaná znakem „|” slouží k přesměrování stdout
(standardního výstupu) na stdin (standardní vstup). Na české klávesnici je možné
daný znak napsat stisknutím kombinace: pravý ALT + W.
11
Kromě rour existují i další možnosti přesměrování standardních vstupů a výstupu.
K tomu slouží speciální znaky „<“ a „>“.
•
„>“ umožňuje přesměrovat standardní výstup do souboru.
•
„>>“ umožňuje přesměrovat standardní výstup a připojit ho na konec
souboru.
•
„<“ umožnuje přesměrování obsahu souboru na standardní vstup
•
„2>“ umožňuje přesměrovat standardní chybový výstup do souboru.
•
Je také možné přesměrovávat standardní výstupy „stdout“ a „stderr" vzájemně
mezi sebou.
A nyní si ukážeme několik příkladů na přesměrování
Mějme situaci, kdy chceme jednoduše provést záznam o testu pomocí programu
ping. Není nic jednoduššího než pomocí parametru navolit parametry testu ping
a přesměrovat jeho výstup do námi zvoleného souboru.
ping www.nic.cz –s 160 –c 500 > ~/muj_test.txt
Přesměrování standardního chybového výstupu na standardní výstup a následně
do souboru „/dev/null“. To znamená, že veškerý výstup bude potlačen, respektive
zahozen.
$ muj_program 2>&1>/dev/null
Toto řešení se používá u periodicky plánovaných akcí, kde nechceme být za
žádnou cenu informování o průběhu nebo selhání daného programu. Nejprve
přesměrujeme standardní chybový výstup na standardní výstup a ten následně
přesměrujeme do speciálního zařízení „/dev/null“. Toto speciální zařízení nedělá
nic jiného, než že zahodí veškerý standardní vstup.
Občas se hodí i přesměrování vstupu ze souboru, viz následující skript.
#!/bin/sh
while read line;
do
echo $line;
done <./muj_soubor_s_daty.txt
V jedné z pozdějších částí textu si představíme několik typických zástupců
skriptovacích jazyku s malou ukázkou jejich použití ve formě jednoduchých
skriptů.
12
Skripty nejsou vázány na použitou platformu, ale pouze na interpret daného
skriptu, a proto jsou skripty většinou dobře přenositelné mezi platformami, pro
které je k dispozici interpret daného skriptovacího jazyka
13
1.4 Programovací jazyky
Tak jako na ostatních OS je možné i v OS Linux tvořit programy v celé řadě
programovacích jazyků. Mezi nejtypičtější představitele je možné zařadit jazyky
C, C++, JAVA a podobně. Podpora programovacích jazyků znamená, že pro
danou platformu existuje patřičný kompilátor a linker.
Velkou výhodou programování právě na platformě Linux je to, že většina
nejrozšířenějších distribucí obsahuje velkou řadu potřebných překladačů přímo ve
svých repositářích. A jak je v Linuxu typické řada z nich je dostupná pod licencí
GNU, nebo podobnou, která umožňuje téměř neomezené využití daných nástrojů
a to zdarma.
Asi nejpoužívanějším překladačem na platformě Linux je bezesporu překladač
GNU GCC. Je třeba vyzdvihnout, že tento kompilátor je velmi kvalitní a podpora
architektur je velmi rozsáhlá. GNU GCC podporuje cca 20 standardních
architektur a celkově více než 60 architektur procesorů pokud zahrneme i méně
běžné typy. V rodině překladačů GNU je dále možné nalézt překladač pro JAVU
GNU Java a překladače pro, v dnešní době, méně obvyklé programovací jazyky,
jakož jsou GNU Ada a GNU Fortran.
Výhodou programovacích jazyků je skutečnost, že kompilátory provádějí značné
optimalizace pro konkrétní platformy a tím dále zefektivňují vykonávání daných
programů.
Nevýhodou může být především užší provázání s konkrétní platformou a proto
horší přenositelnost daného programu na jinou platformu.
14
1.5 Vývojová prostředí
Další nespornou výhodou platformy Linux je dostupnost velké řady vývojových
prostředí pro vývoj aplikací, skriptů a programů.
Prostředím zde rozumíme, jak komplexní IDE (Integrated Development
Enviroment), tak i editory, které dokážou ulehčit práci při vývoji, například
barevným rozlišením syntaxe.
Mezi IDE běžně dostupná v rámci repositářů jednotlivých distribucí Linuxu patří
prostředí „KDevelop“, či „Eclipse“. Doporučit se dá také určitě „Netbeans IDE“,
které je sice potřeba stáhnout ze stránek projektu, ale instalace je velmi
jednoduchá a toto prostředí určitě patří k tomu nejlepšímu, co je možné získat
zdarma.
Jak můžete vidět na následujícím obrázku, možnosti IDE jsou značné a neomezují
se pouze na zvýraznění syntaxe. Dobré IDE vám poskytne přehled o třídách
objektů, umožní vám využívat versovací systémy a poskytne bohatou podporu při
vývoji.
NetBeans IDE 7.1.1
Pokud zmiňujeme Linux, určitě se řadě čtenářů vybaví to, že OS Linux lze velmi
dobře provozovat i bez grafické nadstavby. Ani v tomto případě nemusí být vývoj
15
na této platformě nikterak složitý nebo dokonce nekomfortní. Existuje velké
množství editorů, které dokážou vývoj programů a skriptů velmi zpříjemnit, ať už
uživatelsky přívětivým a intuitivním ovládáním v případě například editoru
„mcedit“, nebo propracovaností ovládání, které je na první pohled složité, ale zato
velmi efektivní při vývoji v případě editorů „emacs“, „vim“ apod.
V případě konzolových textových nástrojů nemůžeme ani opomenout kvalitní
barevné rozlišení syntaxe. Viz následující obrázky, které zachycují barevné
rozlišení syntaxe skriptu v PERLu v editoru „mcedit“. Barevné zvýraznění
syntaxe samozřejmě dokážou poskytovat i další editory.
Zvýraznění syntaxe v editoru mcedit
16
1.6 Shrnutí
Skript vs. Program
Script vs Program
program
script
nutná kompilace po každé úpravě
kompilace pro každou platformu
zvlášť, případně úprava platformě
závislého kódu
spouští se vlastní binární program
nekompiluje se / rovnou se spouští
složitější a delší kód
velmi úsporný a jednoduchý kód
většinou řádově výkonnější kód
většinou řádově menší výkon
stačí nainstalovaný interpret jazyka na
dané platformě
skript běží v interpretru jazyka
Vývojová prostředí
Na platformě Linux je k dispozici velké množství vývojových prostředí a editorů
s podporou syntaxe běžných jazyku. Tato prostředí jsou z velké části součástí
většiny distribucí.
K dispozici jsou jak prostředí pro textový režim („vim“, „emacs“, „mcedit“,
„nano“, …), tak prostředí pro grafické nadstavby OS Linux („KDevelop“,
„Eclipse“, …).
Je možné doinstalovat i další vývojová prostředí, jako například velmi povedené
a populární prostředí „NetBeans IDE“.
17
1.7 Ověření znalostí
Zde vás čeká několik otázek, které vám pomohou ověřit vaše nově nabyté
znalosti.
1. Jak se obecně liší programy a skripty z hlediska výkonu?
2. Co je třeba provést bezprostředně po úpravě programu před jeho
spuštěním?
3. Co musí daný systém obsahovat, aby bylo možné spouštět skripty
konkrétního programovacího jazyka?
4. Jaké editory znáte pro terminálové rozhraní OS Linux?
5. Jaká vývojová prostředí znáte pro grafické rozhraní OS Linux?
ŘEŠENÍ
1. Programy bývají mnohem výkonnější, ale je většinou pracnější je napsat.
2. Program je třeba znovu zkompilovat a nainstalovat pomocí („configure“,
„make“, „make instar“).
3. OS musí obsahovat interper daného skriptovacího jazyka.
4. „vi“, „vim“, „emacs“, „mcedit“, „nano“, … .
5. „Eclipse“, „KDevelop“, „NetBeans“, … .
18
2 Programování v Linuxu – Skripty
2.1 Úvod
V této kapitole si nejprve představíme základní nástroje pro práci v OS Linux, ty
se nám budou hodit pro pochopení a psaní skriptů v SHELLu. Kromě psaní
skriptů v SHELLu, si dále představíme několik typických interpretrových jazyků,
které jsou hojně využívány na platformě Linux.
Skriptovací jazyky neslouží jen pro tvorbu běžných uživatelských skriptů, ale na
těchto jazycích je založena velká řada systémových nástrojů.
Tato kapitola by měla čtenáři, který se ještě nesetkal se skriptovacími jazyky, dát
přehled o tom jaké základní skriptovací jazyky je možné použít a co je možné
pomocí nich realizovat.
19
2.2 Nástroje
Psaní skriptů především pro SHELLy se velmi často opírá a celou řádku
programů, které jsou dostupné ve většině distribucí Linuxu. V následujícím textu
se podíváme na nejdůležitější z nich, abyste snadněji porozuměli následujícím
příkladům.
Pokud byste zde čekali kompletní výpis parametrů daných příkladů a popis jejich
použití, musím vás bohužel zklamat a odkázat vás na manuálové stránky daných
programů. V řadě případů se jedná o velmi komplexní programy s mnoha
desítkami parametrů. Nicméně následující přehled by měl sloužit, jako vodítko
pro ty kdo se ještě s OS Linux ve větší míře nesetkali.
příkaz / operátor
echo
použití / význam
vypíše konec souboru nebo
standardního vstupu na standardní
výstup
vypíše začátek souboru nebo
standardního vstupu na standardní
výstup
skript běží v interpretru jazyka
umožní postupný výpis souboru nebo
standardního vstupu
propracovanější verze programu
„more“
vypíše zadaný text na obrazovku
seq
vygeneruje posloupnost čísel
wc
program spočítá počet řádků, slov
cp
kopíruje soubor nebo adresář
mv
přesouvá soubor nebo adresář
mkdir
vytvoří adresář
rm
odstraní soubor nebo adresář
ls
výpis obsahu adresáře
velmi pokročilý nástroj pro filtrování
textu
velmi pokročilý nástroj pro
vyhledávání v systému souborů
pipe (roura), přesměrování
standardního výstupu na standardní
výstup
přesměrování obsahu souboru na vstup
cat
tail
head
more
less
grep
find
|
<
20
>
přesměrování výstupu do souboru
zabrání ukončení procesu při ukončení
rodičovského procesu (zavření
terminálu)
archivační nástroj
nohup
tar
21
2.3 SH/BASH
Jedná se o asi nejrozšířenější SHELLy na platformě linux. V případě SHELLu
BASH se jedná o rozšíření původního SHELLu SH (Bourne SHell). Odtud
vyplývá i jméno SHELLu BASH (Bourne Again SHell).
Na Linuxové platformě můžete narazit i na další SHELLy, jakými jsou například:
csh, ksh, zsh, atd.
U řady čtenářů může na mysli vytanout otázka, co je to vlastně ten SHELL zač.
SHELL je typicky UNIXové prostředí, které se chová jako interpret příkazového
řádku.
Nejčastěji se se SHELLem setkáváme jako s interpretem příkazového řádku,
nenechte se ale zmást, v tomto případě se jedná o plnohodnotný skriptovací jazyk.
Příkazy je možné jak zadávat na příkazovou řádku tak i zapsat do souboru
a spouštět danou sadu příkazů jako skript. Samozřejmostí jsou řídící struktury,
funkce a další programové konstrukce.
Mějme jednoduchý úkol a to vytvoření 10 ti podadresářů v aktuálním adresáři.
Vše se dá zvládnout elegantně na jediném řádku. Příkaz může vypadat třeba
následovně:
for i in `seq 1 10`; do mkdir ./adresar_$i; done;ls -l;
To samé lze samozřejmě zapsat přehledněji ve formě skriptu. Skript má dále tu
výhodu, že je možné ho spouštět opakovaně.
#!/bin/bash
for in `seq 1 10` do
mkdir ./adresar_$i;
done
ls –l
Skriptům je samozřejmě možné předávat parametry a to tak, že ve skriptu se na ně
odkážeme pomocí symbolu „$“ a pořadovým číslem parametru. Tzn. „$1“ je první
parametr, „$2“ druhý, atd.
Nyní můžeme předávat parametry. Náš skript nyní vytvoří libovolný počet
podadresářů. Skript zavoláme jednoduše s požadovaným parametrem.
$./mujscript.bash 10
Upravený skript (obsah souboru „mujscript.sh“):
#!/bin/bash
for in `seq 1 $1` do
mkdir ./adresar_$i
22
done
ls –l
Proměnné v SHELLu
Proměnné je možné rozdělit na systémové a programové proměnné. Budeme se
zde zabývat především definicí programových proměnných. To jsou ty, které
budeme používat uvnitř skriptů.
Je dobré si uvědomit, že je možné modifikovat obsah jakékoliv proměnné!
Vytvoření proměnné
moje_proměnná=moje_hodnota
Přístup k proměnné
echo $moje_proměnná
Zrušení proměnné
unset moje_proměnná
Numerické operace s proměnnou
$((moje_proměnná + 4))
Přesměrování standardního výstupu do proměnné
moje_proměnná=`cat /etc/passwd |grep root`
23
2.4 AWK
AWK je typickým příkladem jazyka, který vznikl s jasným úmyslem. Tento jazyk
/ nástroj je zaměřen především na zpracování textových dat. Ať již ve formě
textových souborů nebo proudů textových dat.
Je dobré si uvědomit, že AWK můžeme používat buď jednoúčelově na příkazové
řádce v kombinaci s dalšími programy, anebo můžeme napsat skript, který
budeme využívat opakovaně.
Pro AWK dokonce existuje překladač do jazyka C, což dává skriptům napsaným
v AWK vysoký výkonový potenciál.
Chceme získat statistiku nezdařených přihlášení k serveru, pod uživatelem „root“.
Za pomocí skriptu v AWK je řešení více než elegantní.
Typický záznam v logu „/var/log/secure“ vypadá následovně:
Apr
1 09:57:07 My_Linux sshd[15160]: pam_unix(sshd:auth):
authentication \
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=124.74.19.106
user=root
A nyní skript, který dokáže dané záznamy zpracovat a vyhodnotit.
1
2
3
4
5
6
7
8
8
9
10
11
12
#!/usr/bin/awk -f
/failure/{
if( $14 == "user=root" ){
split($13,pole,"=");
stat[pole[2]]++;
}
}
END{
for(i in stat){
print i, stat[i];
}
}
Spuštění skriptu a výsledek:
[root@MyLinux skripty]# ./root_logins.awk /var/log/secure
88.255.50.111 ¨ 1186
124.74.19.106
52
58.211.252.149
8
Skript kontroluje, zda se v daném textu vyskytují řádky, které obsahují slovo
„failure“ viz řádek číslo 3. Dále se kontroluje, že na daném řádku je na čtrnácté
pozici uvedeno „user= root“, což identifikuje pokus o přihlášení s uživatelským
jménem „root“. Pokud tomu tak je, pak je extrahována adresa IP vzdálené strany
z dat na pozici 13 a je inkrementováno počítadlo výskytů v asociativním poli.
V sekci END, která se spouští až na konci skriptu, dojde k vypsání páru IP adresa
a počet výskytů na standardní výstup.
24
2.5 PERL
PERL dnes již určitě patří mezi jazyky, které jsou na ústupu. Ale to nikterak
nesnižuje jeho významnost a důležitost. Na PERLu je založené velké množství
systémových skriptů a nástrojů. Stejně tak napojení PERLu na repositáře CPAN,
je třeba uvažovat jako velmi významnou součást celé filosofie tohoto
programovacího jazyka. Hlavní myšlenka spočívá v tom dělat věci, co možná
nejjednodušeji to jde a pokud možno velice efektivně. Smysl repositářů CPAN
spočívá v tom, že to co už jednou bylo vymyšleno a sepsáno formou skriptů
PERLu není třeba vymýšlet a programovat znovu.
Za povšimnutí stojí, že například jeden z nejrozšířenějších antispamů, kterým je
bezesporu „Spamassassin“, je z velké části napsán právě v jazyce PERL.
Mějme stejný příklad jako v případě skriptovacího jazyka AWK. Výsledný skript
může vypadat například následovně. Pro větší přehlednost díky zvýraznění
syntaxe je daný skript uveden jako obrázek.
Skript root_logins.pl
25
Výstup:
[root@MyLinux skripty]#
IP:58.211.252.149
IP:88.255.50.111
IP:124.74.19.106
./root_logins.pl /var/log/secure
pocet pokusu: 8
pocet pokusu: 1186
pocet pokusu: 52
Ačkoli je PERL typickým zástupcem skriptovacích jazyků tak od verze 5
obsahuje podporu pro objektově orientované programování
26
2.6 Python
Jedná se o moderní skriptovací jazyk, který je v dnešní době velice oblíbený. Do
jisté míry nahrazuje programování v jazyce PERL.
Python je dynamický moderní interpretovaný jazyk, který svými vlastnostmi
přesahuje hranice pouhého skriptovacího jazyka. Jazyk Python totiž umožňuje
vytváření plnohodnotných aplikací včetně grafického rozhraní.
Za velkou výhodu jazyka Python bývá označována ta skutečnost, že je velice
jednoduchý na naučení a produktivnost při psaní programů je na vysoké úrovni.
S tím samozřejmě souvisí dostupnost velké škály knihoven.
Mějme stejný příklad jako v případě skriptovacích jazyků AWK a PERL.
Výsledný skript může vypadat například následovně. Pro větší přehlednost díky
zvýraznění syntaxe je daný skript uveden opět jako obrázek.
Skript root_logins.py
Výstup:
[root@MyLinux skripty]#
IP: 58.211.252.149
IP: 124.74.19.106
IP: 88.255.50.111
./root_logins.py /var/log/secure
pocet pokusu: 8
pocet pokusu: 52
pocet pokusu: 1186
27
2.7 Shrnutí
Jak jste zajisté poznali, jsou skriptovací jazyky velmi vhodné pro hromadné
zpracování dat. Typicky pro data ve formě různých záznamů o životě systému.
Vděčí za to tomu, že původní myšlenkou bylo mimo jiné zpracování rozsáhlých
finančních dat.
Skripty se neomezují ovšem pouze na zpracování textů, ale obsahují i podporu pro
interakci s uživatelem. Nejvýznamnější zaměření na interakci s uživatelem
najdeme pravděpodobně u „skriptovacího“ jazyka Python, který má v sobě
zahrnutou podporu i pro vytváření GUI.
SHELL
Pokud se zaměříme na skripty v SHELLu typu SH/BASH, zjistíme, že jsou velice
vhodné pro jednoduché úlohy a ideálně tam kde se kombinuje celá řádka různých
nástrojů dohromady.
Tam, kde budeme zpracovávat velké množství dat, začne SHELL ztrácet
především na výkonu při práci se souborovým systémem.
AWK
AWK se výborně hodí pro zpracování textů a skripty AWK velmi dobře slouží
i jako podprogramy pro SHELLové skripty.
AWK nepodporuje složitější struktury, objekty a řízení programu. Stejně tak
oproti ostatním jazykům má mnohem menší možnosti v oblasti práci
s proměnnými a datové typy jsou mnohem více limitovány.
PERL
Vnikl jako rozšíření jazyka AWK proto aby odstranil jeho nedostatky, jedná se
o jeden z nejrozšířenějších skriptovacích jazyků a proto je dobré, alespoň částečně
tento jazyk ovládat. Jeho smyslem je dělat věci co nejjednodušeji a ve verzi 5 byl
jazyk rozšířen i o podporu objektového programování.
Dnes je na ústupu a je nahrazován jazykem Python. Pokud je kód napsaný
v PERLu delší, bývá většinou značně složitý a nepřehledný.
28
Python
Jedná se o moderní a oblíbený jazyk. Mluví se o něm jako o velmi snadno
naučitelném jazyce. Je to velice komplexní jazyk pokud jde o otázku jeho
upotřebitelnosti. Je v něm kladen velký důraz na přehlednost a snadnost údržby
kódu.
29
2.8 Ověření znalostí
Zde vás čeká dalších několik otázek, které vám pomohou ověřit vaše nově nabyté
znalosti.
1. K čemu je v OS Linux dobrý symbol „|”? Jak se jmenuje a jak se požívá?
2. Je třeba skripty před spuštěním kompilovat?
3. Jak zajistíte, aby váš skript, který standardně zapisuje chybová hlášení na
standardní chybový výstup, zapsal tyto chybové zprávy do souboru?
4. Jaký skriptovací jazyk použije pro analýzu přístupů k vašemu poštovnímu
serveru na platformě Linux?
5. Jaké vývojové prostředí použijete pro psaní skriptů v AWK a jaké
v případě Pythonu?
ŘEŠENÍ
1. Jedná se o rouru (pipe). Slouží k propojení standardního výstupu jednoho
programu na standardní vstup druhého programu. Použití je například
následující:
cat /etc/passwd | grep root
2. Ne není, je potřeba mít pouze nainstalovaný potřebný interpret daného
jazyka.
3. Je třeba přesměrovat standardní chybový výstup do souboru. Standardní
výstup bude i nadále váš terminál.
$ ./muj_script.pl 2>~/muj_soubor_se_zaznamem.txt
4. Použít můžete samozřejmě jakýkoliv skriptovací jazyk, který vám bude
vyhovovat, není na závadu mít kód o něco delší, ale zato rychleji napsaný
a se stejnou funkcionalitou.
5. Stejně jako v předchozím případě, tato volba je jen na vás. Je dobré si
uvědomit, že existuje celá řada vývojových prostředí, která se hodí pro
rozličné jazyky buď více anebo méně, ale skript napíšete v kterémkoliv
z nich. Nejdůležitější je, aby se vám v daném prostředí dobře pracovalo.
30
3 Programování v Linuxu – Programy
3.1 Úvod
V této části se seznámíme se sadou nástrojů GNU toolchain. Opět zde nepůjde
o to naučit vás programovat v nějakém konkrétním programovacím jazyce, ale jde
o to ukázat, že vaše programy lze velmi snadno posunout na vyšší úroveň
v případě použití patřičných nástrojů.
Jak si v dalším textu ukážeme, je velmi snadné zajistit vygenerování patřičných
skriptů pro konfiguraci a kompilaci vašeho programu na cílové platformě.
Ukážeme si, že to není vůbec složité, že vám to zabere pouze pár minut
a výsledný efekt je ohromující.
Pokud jste se již setkali s instalací programů v Linuxu, konkrétně přes příkazovou
řádku a známý používali jste známý postup „./configure, make, make install“, asi
jste si říkali, co to dalo programátorovi práce, aby kompilace a instalace do vámi
zvolené destinace, případně deinstalace programu probíhala tak hladce. Věřte
tomu, že se to v řadě případů dá zvládnout za pár minut a to právě s použitím
nástrojů GNU toolchain. Jak, to si ukážeme v následujícím textu.
31
3.2 Nástroje – GNU toolchain
Jedná se o skupinu nástrojů pro programování, které byly vytvořeny v rámci
projektu GNU
Součástí jsou projekty: „GCC“, „GDB“, „make“, „autotools“ (Autoconf,
Autoheader, Automake, Libtool) a „Binutils“
Význam těchto projektů je nezanedbatelný už jen z toho důvodu, že tyto nástroje
jsou používány pro vývoj jader systémů Linux a BSD, případně softwaru pro
embeded platformu.
Výhodou těchto nástrojů je fakt, že neslouží pro vývoj pouze velkých projektů, ale
už při užití těchto nástrojů u vašich jednoduchých aplikací, je možné tyto
aplikace, nejen jednodušeji vyvíjet, ale s minimálním úsilím jim vdechnout
spoustu nových vlastností z hlediska konfigurace, kompilace a instalace na
různých platformách.
Pomocí nástrojů obsažených v GNU toolchain je totiž velmi snadné připravit váš
program pro distribuci.
32
3.3 Nástroje – GCC
GNU CC je velmi významný překladač, který obsahuje velmi rozsáhlou podporu
různých architektur. Tato sada překladačů obsahuje podporu pro více než 60
různých procesorových architektur.
Standardní verze kompilátoru „GCC“ obsahuje podporu pro programovací jazyky,
jakož jsou: Ada, C, C++, Fortran, Go, Java, Objective-C, Objective-C++.
Distribuce překladače „GCC“ v sobě navíc obsahuje standardní knihovny pro
jazyky Ada, C, Java.
Nejjednodušší příklad použití gcc by mohl vypadat například následovně:
gcc hello_world.c –o hello_world
„GCC“ neudělá nic jiného než, že přeloží program zapsaný v „hello_world.c“
a vytvoří jeho spustitelnou binární podobu „hello_world“. Samozřejmě za
předpokladu, že program neobsahuje chyby.
33
3.4 Nástroje – make
Program „make“ slouží pro zjednodušení překladu zdrojových kódů programu do
výsledného binárního programu.
Nástroj „make“ se při své běhu řídí instrukcemi, které čte ze souboru „Makefile“
Od souboru „Makefile“ se vyžaduje, aby obsahoval popis všech závislostí, které
mohou nastat při překladu programu. Struktura závislostí může být u větších
projektů velmi složitá, což by v případě ručního vytváření souboru „Makefile“
vedlo k pravděpodobným chybám. Proto se pro vytváření souboru „Makefile“
velmi často používá automatický nástroj „automake“.
Obecná struktura souboru Makefile:
#Komentář
cíl: závislost
příkaz 1
příkaz 2
.
.
.
příkaz N
Konkrétní struktura bude vypadat například takto:
#HelloWorld MakeFile
helloworld: helloworld.o
cc –o $@ $<
helloworld.o: helloworld.c
cc –c –o $@ $<
.PHONY: clean
clean:
rm –f helloworld helloworld.o
Soubor „Makefile“ umožňuje definovat celou řadu užitečných akcí. Mezi ty
základní patří: „install“, „clean“, a „unsintall“. Dosti častý bývá i výsky akcí,
které řídí překlad pro jednotlivé platformy jako například „make linux“ anebo
„make windows“.
Použití je velmi jednoduché:
make clean
make
make install
make uninstall
34
3.5 Nástroje – GNU Binutils
V tomto případě se jedná o soubor jednoduchých nástrojů pro podporu
programování. Jak je z následující tabulky patrné, neomezuje se balík GNU
Binutils pouze na platformu Linux, ale obsahuje podporu i pro systémy Microsoft
Windows. Mezi hlavní programy souboru GNU Binutils patří především GNU
assembler a GNU linker.
Soubor nástrojů GNU Binutils slouží pro vytváření a údržbu binárních programů,
knihoven a manipulaci s objektovým kódem. Používá se ve spojení s „GCC“
a „make“.
Následující tabulka obsahuje přehled nástrojů obsažených v GNU Binutils.
Obsah programového balíku GNU Binutils
Program
Popis
as
assembler
ld
linker
gprof
profiler
addr2line
nm
konverze adres ma soubory a řádky
vytvoření, extrahování a modifikace
archivu
demanglovací jazyk pro C++ symboly
vytváření DLL knihoven pro
Microsoft Windows
konverze objektových dat do formátu
NetWare Loadable Module (NLM)
výpis symbolů z objektových dat
objcopy
kopírování objektových dat
objdump
výpis informací o objektových datech
ranlib
vytváření indexů pro archivy
readelf
zobrazení obsahu ELF souborů
size
výpis velikostí sekcí a celku
strings
zobrazení tisknutelných řetězců
strip
vymazání symbolů z objektových dat
kompilátor pro ressource data (objekty
v souborech Microsoft Windows)
Program
c++filt
dlltool
nlmconv
windres
35
3.6 Nástroje – GDB
Jedná se o standardní nástroj pro ladění programu. Programátorovi poskytuje
možnost sledovat chování programu v jednotlivých částech jeho běhu. Takto
může programátor sledovat program a odhalovat velice rychle jakékoliv
nestandardní chování.
„GDB“ dává programátorovi možnost za běhu programu modifikovat jeho
proměnné, spouštět funkce a modifikovat obsah paměti.
Pomocí nástroje GDB je možné analyzovat chování vzdálených systémů. To
znamená, že GDB může běžet na počítači programátora a laděný program může
být spouštěn například na vzdáleném serveru
GDB se například využívá i ve vývojovém prostředí „Netbeans IDE“ pro vývoj na
platformě Linux. Následující obrázek zachycuje výchozí konfiguraci nástrojů
„Netbeans IDE“. Kromě konfigurace debuggru GDB si můžete všimnout využití
celé řady dalších součástí projektu GNU.
Nástroje GNU v NetBeans
36
3.7 Nástroje – autotools
Sada nástrojů „autotools“ se skládá z následujících částí:
•
GNU autoconf – vygeneruje soubor „configure“ na základě informací
v souboru „configure.ac“
•
GNU automake – slouží k vygenerování přenosných souborů „Makefile“
•
GNU libtool – Slouží pro vytváření statických a dynamických knihoven
•
Gnulib – pomáhá zlepšovat přenositelnost programů kompilovaných využitím
nástrojů „autoconf“ a „automake“.
Následující obrázek zachycuje strukturu použití jednotlivých nástrojů GNU od
vytvoření základních konfiguračních souborů až po sestavení vlastního binárního
programu.
GNU toolchain
37
3.8 Nástroje – configure / make / make install
A nyní se již dostáváme k vlastní konfiguraci,kompilaci a instalaci programů
v OS Linux.
Tím, že máme program připraven a distribuován spolu se skripty, které byly
vytvořeny pomocí balíčku GNU toolchain, máme velmi jednoduchou práci.
Nejprve spustíme skript „configure“ a zadáme mu požadované parametry. Asi
nejdůležitějším parametrem bude bezesporu cílová destinace pro instalaci
programu. Ta se mění pomocí parametru --prefix. Výsledkem je vygenerování
souboru „Makefile“.
Poté již můžeme přistoupit k vlastní kompilaci a sestavení programu pomocí
nástroje „make“. Spuštění se provede jednoduše zadáním příkazu „make“ bez
parametrů ve složce s programem. Jako prerekvizita musí být nejprve úspěšně
vygenerován soubor „Makefile“, viz předchozí krok.
A nakonec je potřeba nainstalovat program do požadované složky zadáním
příkazu „make install“.
Pokud by bylo potřeba daný program někdy odinstalovat, je možné toto provést
jednoduše zadáním příkazu „make uninstall“
Pokud by bylo potřeba provést čistou kompletní kompilaci programu znova, je
možné vyčistit zdrojovou složku pomocí zadání příkazu „make clean“.
Velkou výhodou při kompilaci programů je skutečnost, že pokud je potřeba
program z nějakého důvodu rekompilovat, jsou rekompilovány pouze změněné,
nebo prozatím nezkompilované části, což například v případě kompilace velkých
projektů jakož je Linuxové jádro, nebo projekt Openoffice ušetří velké množství
času
.
38
3.9 Ověření znalostí
Zde vás čeká dalších několik otázek, které vám pomohou ověřit vaše nově nabyté
znalosti.
1. Co je obsahem GNU toolchain?
2. Jak nainstalujete program, pokud máte k dispozici zdrojové kódy a skripty,
které byli připraveny nástroji GNU toolchains?
3. Jaké dva soubory musíte sami připravit pro nástroje GNU toolchain
(nezapočítáváme-li zdrojový kód a použití nástroje „autoscan“)?
4. K čemu slouží nástroj GDB?
5. Je možné programy
odinstalovat?
instalované
ze
zdrojových
kódů
korektně
ŘEŠENÍ
1. Součástí je „GCC“, „GDB“, „make“, „autotools“ (Autoconf, Autoheader,
Automake, Libtool) a „Binutils“
2. Postup bude následující:
1. ./configure --prefix=/adresar/kam/se/ma/program//nainstalovat
2. make
3. make install
3. Je třeba připravit soubory „configure.ac“ a „Makefile.am“.
4. Jedná se o GNU debugger. Tento nástroj slouží k odhalování chyb při
vývoji programu.
5. Ano, pokud je program instalován z takového zdroje, který obsahuje
i patřičné skripty pro odinstalaci programu, tedy například ty připravené
pomocí GNU toolchain. Provádí se typicky voláním „make uninstall“ ve
složce se zdrojovými kódy programu.
39
4 Programování v Linuxu – Co se jinam
nevešlo
4.1 Další možnosti ladění programů – valgrind,
a electric fence,
Při psaní větších nástrojů se vám zajisté budou hodit i další pokročilé nástroje pro
usnadnění hledání chyb ve vašich programech.
„electricfence“ – program, který dokáže v případě chyby paměti zastavit
vykonávání instrukce a ve spoluprácí s GDB zobrazit patřičnou řádku zdrojového
kódu.
„valgrind“ – tento program vám pomůže diagnostikovat chyby, které se týkají
chybného přístupu do paměti, případně vám umožní analyzovat úniky paměti.
Nesmíme zapomenout ani na schopnost ladění více vláknových programů.
Uvažujme například následující kód, je v něm zjevná chyba. Program se snaží
zapsat na 11 pozici do pole, pro které byla alokována paměť pouze pro 10
položek.
Program obsahující chybný přístup do paměti
Kompilace tohoto programu proběhne bezchybně. Ovšem již při prvním zpuštění
program selže s a vypíše chybu:
*** glibc detected *** ./main: free(): invalid next size (fast):
0x0000000013d64010 ***
40
***
glibc
detected
0x0000000013d64040 ***
***
./main:
free():
invalid
pointer:
Takovéto hlášení chyby neposkytuje dostatečné informace pro snadné odhalení
chyb v rozsáhlejším kódu. Je proto nanejvýš vhodné použít nějaký mocnější
nástroj jakým je například „valgrind“. Výsledek ladícího výpisu z programu
„valgrind“ je zachycen na následujících řádcích.
[ondra@F16 programs]$ valgrind ./program_with_error
==28384== Memcheck, a memory error detector
==28384== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward
et al.
==28384== Using Valgrind-3.6.1 and LibVEX; rerun with -h for
copyright info
==28384== Command: ./program_with_error
==28384==
0,
0, 1,
0, 1, 2,
0, 1, 2, 3,
0, 1, 2, 3, 4,
0, 1, 2, 3, 4, 5,
0, 1, 2, 3, 4, 5, 6,
0, 1, 2, 3, 4, 5, 6, 7,
0, 1, 2, 3, 4, 5, 6, 7, 8,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
==28384== Invalid write of size 4
==28384==
at 0x4008AA: main (main.cpp:9)
==28384== Address 0x4c37068 is 0 bytes after a block of size 40
alloc'd
==28384==
at 0x4A06A27: operator new[](unsigned long)
(vg_replace_malloc.c:305)
==28384==
by 0x40088C: main (main.cpp:7)
==28384==
==28384== Invalid read of size 4
==28384==
at 0x4008C2: main (main.cpp:11)
==28384== Address 0x4c37068 is 0 bytes after a block of size 40
alloc'd
==28384==
at 0x4A06A27: operator new[](unsigned long)
(vg_replace_malloc.c:305)
==28384==
by 0x40088C: main (main.cpp:7)
==28384==
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
==28384==
==28384== HEAP SUMMARY:
==28384==
in use at exit: 0 bytes in 0 blocks
==28384==
total heap usage: 1 allocs, 1 frees, 40 bytes
allocated
==28384==
==28384== All heap blocks were freed -- no leaks are possible
==28384==
==28384== For counts of detected and suppressed errors, rerun
with: -v
==28384== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2
from 2)
41
Jak si můžete ve výpisu všimnout, díky spuštění pomocí programu „valgrind“
došlo k tomu, že byl program spuštěn až do konce i přes kritickou chybu v alokaci
paměti.
Velmi důležitou schopností programu „valgrind“ je také to, že dokáže analyzovat
alokaci a uvolňování paměti a tím pomoci eliminovat úniky paměti. To je
obzvláště důležité u dlouho běžících programů a daemonů, kdy by v případě
existence úniků paměti mohlo dojít k alokaci zbytečného množství paměti anebo
až k vyčerpání veškeré volné paměti.
42
4.2 Služby – démoni
Určitě si vybavíte některé procesy, které jsou spouštěny již při spuštění systému
a běží až do jeho ukončení. Takové procesy mají typicky za úkol obsluhu událostí
v OS a je celkem jedno zda se jedná o obsluhu diskového pole, nebo zasílání
webových stránek uživatelům.
Službě typicky běžící v OS UNIX/Linux na pozadí se říká Daemon. Dle toho jsou
většinou i pojmenovány dané programy. Ke jménu souboru se připojuje písmenko
„d“, které značí to, že se jedná o démona. Viz například: „sshd“, „httpd“,
„mysqld“, ….
V následujícím textu si ukážeme, jak je možné vytvořit process, který bude
daemonem.
1. Nejprve je třeba zavolat systémové volání „fork()“, a ukončit rodičovský
proces. Tímto krokem by se měl náš program odpoutat od SHELLu, ze
kterého byl spuštěn.
2. Je třeba zavolat systémové volání „setsid()“. Toto volání vytvoří novou
skupinu procesů a učiní náš proces jediným členem této skupiny a zároveň
převezme řízení nad touto skupinou.
3. Je třeba zavolat znovu systémové volání „fork()“, a ukončit rodičovský
proces. Díky tomu, že aktuální proces není řídícím procesem skupiny, tak
nemá ani žádný řídící terminál.
4. Je dobré změnit pracovní adresář procesu na adresář „/“, nebo na nějaký
jiný bezpečný adresář. Jedná se zde o to, aby pracovní adresář nebyl
v nějaké části souborového systému, která může být během běhu procesu
odpojena, typicky třeba NFS souborový systém.
5. Nyní je třeba zavolat systémové volání „umask(0)“. Tímto dosáhneme
vynulování masky zabezpečení pro vytváření souboru a adresářů. To nám
dovolí nastavit práva pro vytvářené soubory dle našeho uvážení.
6. V poslední fázi je třeba zavřít všechny otevřené popisovače souborů.
Standardní postup je buď uzavřít pouze standardní deskriptory 0,1 a 2
(„stdin“, „stdout“ a „stderr") anebo vytvořit smyčku, která se pokusí
uzavřít všechny možné deskriptory, které může proces mít (zjistí se
maximální možný počet popisovačů a provede se smyčka od 0 do tohoto
počtu).
7. Nyní máme připraveného daemona a může následovat zbytek kódu
procesu.
Daemona můžeme vytvořit nejenom jako klasický program, ale výše uvedená
pravidla se vztahují jak na programy tak skripty.
Kód funkce pro vytvoření démona v jazyce C/C++ může vypadat následovně:
43
Na následujícím obrázku je zachycena ukázka kódu Daemona v jazyce C/C++
Vytvoření démona
44
4.3 Automatické spouštění a plánování
Programy a skripty není nutné spouštět pouze ručně, ale velmi často je třeba
plánovat spuštění programu nebo skriptu v nějaký konkrétní čas. K tomu je
v Linuxu opět k dispozici celá řada nástrojů. Mezi nejpoužívanější patří příkaz
„at“ a „cron“. Příkaz „at“ se ve většině případů používá pro plánování
jednorázových akcí a daemon „cron“ se naopak používá především pro opakované
akce.
45
4.4 Automatické spouštění a plánování - at
„at“ – příkaz slouží pro jednorázové spouštění příkazů v daný čas, příkazů je
možné plánovat libovolné množství. Krom programu „at“ je možné používat
i další příkazy, které slouží pro obsluhu příkazů zadaných příkazem „at“.
„atq“ – zobrazení seznamu naplánovaných událostí.
Následující příkaz ukazuje naplánování zaslání emailu po uplynutí 5 minut.
Samozřejmě místo zaslání emailu, je možné tímto způsobem spustit téměř
jakoukoliv akci.
[ondra@F16 ~]$ echo '"My MSG"| mail -s MSG [email protected]'| at
now + 5min
Kontrola zda je náš příkaz ve frontě.
[ondra@F16 ~]$ atq
job 1 at 2012-04-01 19:15
Ještě nenastal čas pro spuštění úlohy.
[ondra@F16 ~]$ date
Sun Apr 1 19:11:57 CEST 2012
46
4.5 Automatické spouštění a plánování - cron
„cron“ – tento program, nebo přesněji daemon, slouží pro periodické spouštění
procesů v naplánovaný čas. Typicky je v OS Linux používán jako hlavní
plánovač.
Program „cron“ se opírá o definici úloh v souboru „/etc/crontab“. Na úrovni
jednotlivých uživatelů jsou úlohy definovány v adresáři „/var/spool/“.,
Struktura souboru „crontab“ je zachycena na následujícím obrázku.
Struktura časových údajů v souboru „/etc/crontab“
•
Na první pozici se zapisují minuty, ve kterých má být daný skript zpuštěn.
•
Na druhou pozici se zapisují hodiny, ve kterých má být daný skript zpuštěn.
•
Na třetí pozici se zapisují dny v měsíci, ve kterých má být daný skript zpuštěn.
•
Na čtvrtou pozici se zapisují měsíce, ve kterých má být daný skript zpuštěn.
•
Na pátou pozici se zapisují dny v týdnu, ve kterých má být daný skript zpuštěn
V řadě systémů je definována následující struktura adresářů:
/etc/cron/
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
Již z názvu adresářů je celkem jasné k čemu dané adresáře slouží. První slouží pro
obecné plánování událostí, soubory musejí být ve stylu „crontab“. Ostatní
adresáře fungují tak, že skripty do nich vložené jsou periodicky spouštěny. A to
jednou denně, jednou týdně a jednou za měsíc. Dané skripty nemusejí být nijak
upravovány a stačí je pouze vložit, nebo na ně vytvořit odkaz v daném adresáři.
47
4.6 Shrnutí
Ladění programů
Ladící nástroje vám mohou v řadě případů velmi ulehčit odlaďování programů
a hledání chyb. V případě, že se budete programování věnovat více, patrně
dospějete k tomu, že je třeba používat více různých nástrojů. Pro běžné ladění
programů a krokování budete pravděpodobně používat velmi rozšířený GNU
debugger GDB v kombinaci s „electricfence“, nebo podobným programem.
Pokud se dostanete do situace, kdy budete programovat nějakého démona, který
poběží velmi dlouho, zajisté uvítáte detekci úniků paměti v nástroji „valgrind“.
Plánování
Pro plánování jednorázových akcí vám velmi dobře poslouží nástroj „at“
Pro periodické plánování se vám bude hodit daemon „cron“. Buď můžete umístit
své skripty do adresářů „/etc/cron.hourly, /etc/cron.daily, /etc/cron/weekly,
/etc/cron.monthly” a nebo definovat spouštení umístěním konfiguračního souboru
do adresáře „/etc/crond“.
Daemoni
Pokud budete vytvářet nějakou službu, která by měla běžet většinu času, kdy bude
systém spuštěn, zauvažujte o tom, zda nemá cenu napsat danou službu jako
démona. Není to složíté a stačí dodržet pouze několik pravidel.
Daemon nemusí být pouze program, ale démona můžete vytvořit i jako skript.
48
4.7 Ověření znalostí
Zde vás čeká dalších několik otázek, které vám pomohou ověřit vaše nově nabyté
znalosti.
1. Čím se liší daemon od běžného programu?
2. Jaký program použijete pro plánování jednorázových akcí v OS Linux?
3. Jaký program použijete pro plánování periodických akcí v OS Linux?
4. Jaký program můžete použít, pokud váš program havaruje v důsledku
chybné práce s pamětí?
5. Je možné některý z debuggrů použít i pro více vláknové aplikace? Který?
ŘEŠENÍ
1. Je to program, který běží typicky na pozadí a tím, že není svázán
s terminálem uživatele, nedojde k jeho ukončení po uzavření terminálu.
Stejně tak komunikace neprobíhá přes standardní vstup a výstup
v terminálu.
2. Program „at“.
3. Program „cron“.
4. Vhodný program bude „valgrind“
5. Program „valgrind“ umožňuje ladění více vláknových aplikací.
49
5 Přestávka
A nakonec pohádka …
void pohadka() {
if (princ.sila > drak.sila)
{
drak.delete();
princ += princezna + kralovstvi/2;
}else
{
princ -= hlava;
drak.hmotnost += princezna.hmotnost;
kral.status = "Smutny";
kralovstvi.goto("pr..l");}
}
50
6 Programování v Linuxu – závěrečné
cvičení
6.1 Test
1. Jaký nástroj vám pomůže odhalit úniky paměti?
a) gdb
b) gcc
c) make
d) valgrind
správné řešení: d
2. Jaký nástroj vám umožní ladit více vláknové aplikace
a) gdb
b) gcc
c) make
d) valgrind
správné řešení: d
3. U jakého příkazu zadáte jako parametr cestu pro instalaci vašeho
programu?
a) make
b) make install
c) ./configure
d) gcc
správné řešení: c
4. Pro jaký programovací jazyk nemá standardní verze překladače GCC
podporu?
a) C++
b) Java
c) Pascal
d) Go
správné řešení: c
51
5. Jaký příkaz je třeba zavolat pro konečnou instalaci zkompilovaného
programu do patřičné destinace?
a) make
b) make install
c) ./configure
d) gcc
správné řešení: b
6. Jaký příkaz je třeba zavolat pro odinstalaci námi zkompilovaného
programu?
a) make
b) make install
c) make uninstall
d) make clean
správné řešení: c
7. Jaký příkaz použijete pro naplánování jednorázové události?
a) ntp
b) do
c) at
d) date
správné řešení: c
8. Jaký daemon použijete pro spouštění opakovaných událostí?
a) ntpd
b) crond
c) sshd
d) httpd
správné řešení: b
52
9. Jak zjistíte jaké jednorázové úlohy máte naplánovány na spuštění
v budoucnosti?
a) ntpq
b) atq
c) queue
d) cronqueue
správné řešení: b
10. Jaké popisovače souborů(file descriptors) byste měli uzavřít při vytváření
Daemona?
a) standardní vstup
b) standardní vstupy a výstupy
c) standardní výstupy
d) všechny
správné řešení: d
11. K čemu slouží symbol „|“ (roura) v OS Linux?
a) přesměrování standardního výstupu do souboru
b) Propojení standardního výstupu se standardním vstupem dalšího programu
c) Přesměrování souboru na standardní vstup
d) přesměrování chybového výstupu na standardní výstup
správné řešení: b
12. K čemu slouží symbol „>„ v OS Linux?
a) přesměrování standardního výstupu do souboru
b) Propojení standardního výstupu se standardním vstupem dalšího programu
c) Přesměrování souboru na standardní vstup
d) přesměrování chybového výstupu na standardní výstup
správné řešení: a
53
13. K čemu slouží symbol „<„ v OS Linux?
a) přesměrování standardního výstupu do souboru
b) Propojení standardního výstupu se standardním vstupem dalšího programu
c) Přesměrování souboru na standardní vstup
d) přesměrování chybového výstupu na standardní výstup
správné řešení: c
14. Kolik procesorových architektur podporuje kompilátor GCC
a) 6
b) 15
c) cca 30
d) více než 50
správné řešení: d
15. Jak se jmenuje interpret příkazového řádku v OS Linux?
a) PERL
b) SHELL
c) Python
d) gcc
správné řešení: b
16. S jakou přesností dokáže daemon crond plánovat události?
a) 1 setina vteřiny
b) 1 vterina
c) 1 minuta
d) 5 minut
správné řešení: c
54
17. Jaké proměnné je možné v SHELLu přenastavit?
a) programové proměnné
b) systémové proměnné
c) všechny proměnné
d) pouze proměnné v domovském adresáři
správné řešení: c
18. Jaká vývojová prostředí není možné použít v textovém rozhraní OS
Linux?
a) mcedit
b) Kdevelop
c) Eclipse
d) vi
správné řešení: b, c
19. Jaké editory je možné použít pouze v textovém rozhraní OS Linux?
a) Kdevelop
b) mcedit
c) Eclipse
d) vi
správné řešení: b, d
20. U kterých programovacích jazyků je třeba nejprve program kompilovat?
a) Java
b) Python
c) C++
d) PERL
správné řešení: a, c
55
21. U kterých programovacích jazyků není nutná kompilace zdrojového
kódu?
a) AWK
b) Java
c) PERL
d) Python
správné řešení: a, c, d
22. V Linuxu je možné přesměrovat … ?
a) standardní výstup na standardní chybový výstup
b) standardní výstup na standardní vstup
c) standardní chybový výstup na standardní vstup
d) soubor na standardní vstup
správné řešení: a, b, d
23. Které nástroje patří do skupiny GNU toolchain?
a) gparted
b) gcc
c) gdb
d) gzip
správné řešení: b, c
24. Jaké nástroje patří do skupiny Autotools
a) make
b) autoconf
c) automake
d) as
správné řešení: b, c
56

Podobné dokumenty

Open Source Programování - Introduction GNU - Real

Open Source Programování - Introduction GNU - Real RTL FPGA návrh – Verilog – dvojí licence GPL a proprietární RTL pro PCI bridge ASIC bude uvolněno pod GPL po zaplacení ceny návrhu chipu Stránky projektu: http://www.opengraphics.org/ Projekt vznik...

Více

26th annual technical conference Relax Hotel Moninec

26th annual technical conference Relax Hotel Moninec dodávek informačních technologií hlavní náplní. Dolf uvádí ZČU jako největší podnik v západních Čechách, ale platí to jistě i z pohledu celostátního. Za tím se skrývají tisíce uživatelů, tisíce poč...

Více

Abíčko - AbcLinuxu.cz

Abíčko - AbcLinuxu.cz Pro nekomerční účely smíte tento dokument jakkoliv šířit v tištěné i digitální podobě. V ostatních případech nás požádejte o svolení na adrese [email protected].

Více

User Manual

User Manual Před prvním použitím televizoru si přečtěte bezpečnostní pokyny. V nabídce Nápověda přejděte do části Bezpečnost a péče > Bezpečnost.

Více

Nainstaloval jsem a jak dál?

Nainstaloval jsem a jak dál? ani mezery => problémy při přenosu do Lin/Win Michal Turek

Více

Fedora 12 Constantine

Fedora 12 Constantine FUDCon a Developer conference Prezentace na univerzitách (Red Hat Day v Ostravě, VUT a MUNI Brno, Plzeň) Prezentace na konferencích

Více

Optimalizace a profilování

Optimalizace a profilování Intel Vtune AMD CodeAnalyst Cvičení

Více

Úvod do UNIXu - Okruh č. 4 - vi, regulární výrazy, grep a sed

Úvod do UNIXu - Okruh č. 4 - vi, regulární výrazy, grep a sed ukončení s uložením byli-li provedeny změny při read-only, pak ! vynutí ukončení

Více

Část 4

Část 4 Dynamické volání kernelu I • Nová možnost dynamického paralelismu • Vhodné pro neregulární situace, kdy „klasické“ řešení není efektivní • Od CUDA CC 3.5 může kernel volat jiné kernely včetně (pří...

Více