Hlavní navigace

Začněte s Céčkem v Linuxu

Jiří Petrlík

Programovali jste v jiném operačním systému a teď chcete začít programovat pod Linuxem? Jedním z nejvhodnějších kandidátů je jazyk C. Koupili jste si knihu o Céčku a nevíte jak na něj v Linuxu? Nevíte jak v Linuxu přeložit program, odladit chyby a podobně? Pak je tento článek právě pro vás.

Hned na začátku chci upozornit, že tento článek je určen pro začínající programátory, kteří si možná teprve nedávno nainstalovali operační systém Linux a chtěli by v něm začít programovat. Pokud máte již nějaký ten program odkompilovaný, téměř určitě zde nenajdete nic nového. Také chci upozornit, že se nejedná o učebnici jazyka C, ale o článek, který radí, jak tento programovací jazyk používat v Linuxu. Zkušenějším programátorům se jistě budou zdát informace zde trochu zmatečné. Nezaměřuji se například jenom na kompilátor apod., ale snažil jsem se uspořádat informace chronologicky podle toho, co mě zajímalo, když jsem začínal já sám programovat.

Kompilujeme

Nebudu zde rozebírat, jak napsat a uložit soubor se zdrojovým kódem, to jistě každý zvládne ve svém oblíbeném editoru. Co ale teď s ním, jak ho zkompilovat? Pro kompilaci Céčka se v Linuxu nejčastěji (téměř vždy) používá kompilátor GCC. Tento kompilátor je přítomen snad ve všech distribucích operačního systému Linux, takže ho nemusíte nijak zvlášť shánět. stačí ho nainstalovat(pokud jste tak ještě neučinili) z příslušného balíčku.

Řekněme, že máme napsaný velmi krátký program „Ahoj světe“, který může vypadat například takto:

#include <stdio.h>

main()
{
  printf("Ahoj svete\n");
} 

Uložíme ho do souboru hello.c a chceme ho zkompilovat. Pro kompilaci spusťte příkaz:

# gcc hello.c -o hello

Jak jste už asi pochopili, samotný kompilátor se spouští příkazem gcc, za ním následuje jméno překládaného souboru a za -o se napíšete jméno spustitelného souboru, do kterého se má výsledný program uložit. Zda jste uspěli, si můžete jednoduše vyzkoušet, když program spustíte, např.:

# ./hello

Gratuluji, právě se vám podařilo přeložit váš první linuxový program. Tímto možnosti překladače GCC zdaleka nekončí, další informace můžete získat například z man stránky k programu, kterou zobrazíte jednoduše příkazem man gcc. Připomínám, že ji zavřete stisknutím klávesy q.

Hledáme chyby

Každý program obsahuje chyby, a proto je dobré vědět, jak na ně. Běžně se užívají speciální programy nazývané debuggery. Pomocí nich se můžete doslova „podívat“, co se v programu právě odehrává. Takovýto program samozřejmě pro Linux existuje, jmenuje se GNU Debugger (zkráceně GDB). Opět by ho měla obsahovat téměř každá distribuce Linuxu.

Abyste ho ale mohli použít, musíte program, který chcete zkontrolovat, přeložit s parametrem -g. Jako příklad můžeme použít následující program:

#include <stdio.h>

main()
{
  int a,b,pom;
  a=1; b=2;
  /* Prohození hodnot proměnných */
  pom=a;
  a=b;
  b=pom;
  /* Výpis */
  printf("a=%d b=%d\n",a,b);
} 

Tento program nastaví hodnotu proměnné a na 1 a hodnotu proměnné b na 2. Poté obsah obou těchto proměnných prohodí, k tomu slouží pomocná proměnná pom. Řekněme, že se chceme podívat, co se v programu vlastně děje.

Zkompilujeme ho proto s parametrem -g, který způsobí, že se do výsledného programu uloží i některá pomocná data určená pro debugger. Můžeme to udělat například příkazem:

# gcc prohazovani.c -o prohazovani -g

Samozřejmě pokud se soubor se zdrojovým kódem nazývá prohazovani.c. Nyní nám nic nebrání použít na zkompilovaný program debugger.

Napište tedy do příkazové řádky příkaz gdb prohazovani. Pochopitelně prohazovani je název zkompilovaného programu. Nyní se spustí debugger a my můžeme jednoduchým příkazem run náš program spustit. Pokud budete chtít spustit program s nějakými parametry, napište je za run.

Takto jen tak spouštět program nemá celkem smysl, dostaneme totiž stejný výstup, jako když ho spustíme bez debuggeru.

V tomto programu nás asi bude nejvíce zajímat chování proměnných. Debugger nám umožňuje program stopnout na určitém řádku a prohlížet si obsahy proměnných. Můžeme si náš program stopnout třeba na devátém řádku ( a=b). Můžeme říci, že na 9 řádek umístíme tzv. breakpoint. To provedeme příkazem debuggeru break 9. Devítka je pochopitelně číslem řádku.

Program spustíme a ten se zastaví na onom 9. řádku. Nyní se pokusíme vypsat obsah proměnné pom. K tomu využijem příkaz print pom. Nyní by se mělo vypsat: $1=1. Za rovnítkem se vypsal obsah zadané proměnné. Tímto si můžeme u našeho programu zkontrolovat, že jednička, kterou obsahuje proměnná a, je bezpečně uložena do pomocné proměnné pom a můžeme ji tedy bezpečně přepsat.

Další zajímavou možností, kterou nám debugger umožňuje je tzv. trasování zásobníku. My tuto schopnost asi nejčastěji využijeme pokud náš program neočekávaně skončí se všemi známou chybou „Segmentation fault“. Kdo ji nezná, tak ji při programování v C určitě brzy pozná – neoprávněný přístup do paměti. V takovém případě nemusíme ani tušit, kde v programu je chyba. Abychom to zjistili, stačí v debuggeru napsat příkaz backtrace. Vypíše se jakýsi „seznam spouštěných funkcí“, ze kterého můžeme vyčíst, v kterém místě program skončil.

Tento příkaz můžeme vyzkoušet na dalším příkladě, který pracovně nazveme pointery. O jeho smysluplnosti prosím neuvažujte – slouží pouze pro ukázku.

#include <stdio.h>

nova_funkce()
{
  char *a;
  a=(char *) malloc(1);
  a=500; /* Hrubá chyba! */
  *a='!';
  free((void *) a);
}

main()
{
  printf("Program pointery\n");
  nova_funkce();
} 

Právě tento program nám skončí onou chybou Segmentation fault. Po zadání příkazu backtrace do debuggeru výpis jednoznačně ukazuje, která funkce obsahuje chybu:

#0  0x08048413 in nova_funkce () at pointery.c:8 - chyba!
#1  0x08048444 in main () at pointery.c:15

Stejně tak jako u překladače gcc je i u gdb velké množství dalších funkcí. Cílem tohoto článku nebylo vás s nimi seznámit, chtěl jsem jen napsat věci, které jsem jako první zjišťoval, když jsem chtěl programovat v Céčku pod Linuxem. I když se mohou někomu zdát naprosto triviální, věřím, že mnohým z vás pomohou. A ještě dodatek: gdb se ukončuje příkazem  quit.

Anketa

Programujete v Céčku?

Našli jste v článku chybu?

23. 6. 2006 1:32

pht (neregistrovaný)
jj a navic zadny z mainu nevraci navratovou hodnotu.
autor by si nejdriv tu knihu o C mel docist sam. :)

23. 6. 2006 1:06

Liskni_si (neregistrovaný)
Nejsou no, ale zakladni problem je, ze autor neuci prekladat s -Wall.
Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: 7 druhů hotových těst na vánoční cukroví

7 druhů hotových těst na vánoční cukroví

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA