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

23. 6. 2006
Doba čtení: 4 minuty

Sdílet

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.

bitcoin_skoleni

#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.

Programujete v Céčku?