Labor, 1. hét: operációs rendszer

Pohl László, Czirkos Zoltán · 2015.02.18 · Frissítve: 2015.02.15

Operációs rendszer, Windows parancssor alapismeretek: fájlok, szabványos bemenet és kimenet, parancssori argumentumok. Egy egyszerű C program lefordítása.

Bár az átlagos felhasználó nem szokta használni, a Windows is rendelkezik egy ún. parancssori felhasználói felülettel, ahogyan a Unix típusú operációs rendszerek is. Ezen a felületen különböző parancsokat begépelve lehet elvégezni az alapvető feladatokat, pl. fájlok létrehozását, listázását és törlését.

A mai laboron ezzel ismerkedünk meg, míg a Programozás alapjai 2. tárgy a Unix parancssori felületét fogja bemutatni.

1Parancssor indítása

A Start menü Futtatás… parancsát választva indítsd el a cmd.exe programot! (A Start menü Programok/Kellékek/Parancssor pontjára kattintva is elindul.) A továbbiakban a megjelenő konzolablakban kell dolgozni. A föl-le billentyűkkel kiválaszthatóak a korábban beírt parancsok, így nem kell ismét begépelni.

Prompt

A kurzor az ún. prompt végén villog. Ez alapesetben az aktuális útvonalból (mappa nevéből, path) és a > jelből áll. Ezt át lehet állítani, ami például akkor lehet hasznos, ha egyszerre több gépre vagyunk bejelentkezve Interneten keresztül: a prompt mutathatja azt is, hogy melyikre. Próbáld ki a prompt átállítását! Írd be a következőt, majd nyomj egy Enter-t:

prompt szia$g

A prompt ettől megváltozik, és már nem mutatja a mappa nevét. Az eredetit a

prompt $p$g

parancs megadásával állíthatod vissza. A további lehetőségekről a

prompt /?

paranccsal tájékozódhatsz.

2Program indítása parancssorból

Egy program indításához csak be kell írni a nevét. Írd be:

notepad.exe

Erre elindul a Jegyzettömb, mintha a Start menüből indítottad volna. Az ablakot becsukhatod.

A Windows automatikusan kiegészíti a programok nevét az ahhoz tartozó kiterjesztéssel (végződéssel, extension, .com, .exe, .bat). Így a programot a .exe kiterjesztés beírása nélkül is futtathatod:

notepad

3Mappa parancsok

A mappát (folder) a parancssori parancsok a directory szóból származtatják (a mappák másik neve, magyarul könyvtár). A mappa tartalmának listázása:

dir

Az eredmény a mappa tartalma: itt további mappák, valamint fájlok lehetnek. Ha nem a legfölső szinten (a gyökérkönyvtárban) vagyunk (C:\), akkor egy . és egy .. nevű mappa (<DIR> jelzi) is látható. A . az aktuális mappát jelenti, a .. az egy szinttel feljebb lévőt. Hasonlítsd ezt össze az Intézőben látható tartalommal!

A dir parancsnak számos kapcsolója van, ezekről bővebb információ a

dir /? 

paranccsal kapható. A többi parancsnak is van hasonló helpje, ezt a továbbiakban nem jelezzük külön.

Mappa váltása

Mappát váltani a chdir paranccsal, vagy ennek rövidebb változtaával, a cd-vel lehet. Lépjünk egy szinttel feljebb:

cd ..

Lépjünk a gyökérkönyvtárba:

cd \

vagy

cd /

A mappák neveit a \ (fordított per vagy visszaper (backslash), AltGr+Q) választja el egymástól az elérési útvonalon. A Windows támogatja a UNIX-ból származó /-t is, a két jel bármelyikét bármikor használhatjuk. A Windows hasonlóan rugalmas a kis és nagybetűk kezelésében: a mappák és fájlok és parancsok nevében nem számít, hogy kis- ill. nagybetűről van szó (pl. notepad, Notepad, NOTEPAD, stb. egyaránt használható). Más, pl. UNIX alapú rendszerek megkülönböztetik ezeket. Informatikusként mindkét rendszerrel dolgoznod kell majd, ezért jobb, ha mindent a tényleges nevén használsz.

Menj most vissza a felhasználód saját mappájába, a lentihez hasonló módon! Az 111111 helyére a felhasználóneved kerül.

cd C:\Users\111111\

Mappa létrehozása és törlése

Mappát létrehozni az mkdir vagy md parancsokkal lehet:

md clabor

Mappát törölni az rmdir vagy rd paranccsal lehet:

rd clabor

A parancs a mappát csak akkor törli, ha az üres.

Megjegyzés. Lehet, hogy már van ilyen nevű mappa a gépen, mert egy korábbi órán valaki létrehozta. Ekkor indítsd el az Intézőt, és töröld le a mappát!

Vigyázz! Ha az alábbi sort írod, két mappa jön létre, egy „c” és egy „labor” nevű:

md c labor

Ha „c labor” nevű mappát szeretnél, tedd idézőjelbe a nevet! (Akkor is szabad idézőjelbe tenni, ha nincs benne szóköz? Próbáld ki!)

md "c labor"

Hozd létre ismét a clabor mappát, és lépj bele!

Elérési útvonal – path

Honnan tudta az előbb a Windows, hogy hol van a notepad.exe? Onnan, hogy van egy lista azokról a mappákról, ahol a gyakran használt programok vannak. Így nem kell mindig beírni a mappa teljes nevét. A listát így tudod kiíratni:

path

A felsorolást kibővíthetjük a saját mappánkkal:

path clabor;%PATH%

Megjegyzés: A bővítés csak ebben a parancssori ablakban érvényes. Ha újat nyitunk, ott újra be kell írnunk.

4Be- és kimenet átirányítása

A more parancs sok dologra használható, most a begépelt szöveg ismételt megjelenítésére fogjuk. Írd be:

more

Most nem jelent meg a prompt, ami mutatja, hogy a more program éppen fut, és várja tőlünk a bemenetét. Írj be tetszőleges szöveget, és nyomd meg az Enter-t. Mi történik? Ezt többször is megismételheted. A Ctrl+Z billentyűkombinációval léphetsz ki a more-ból, vissza a parancssorba.

Jegyezd meg: a more fájl vége jelig olvas be szöveget. Ha ezzel találkozik, kilép. Ha billentyűzetről gépelsz, a Windowsban a fájl, vagyis a begépelt szöveg vége jelet a Ctrl+Z-vel lehet adni.

A konzol programokból a Ctrl+C kombinációval is ki tudsz lépni, ez az ablakozó programok jobb felső sarkában lévő × programbezárás gombnak felel meg.

Írd be:

more > szoveg.txt

Gépeld be ismét szövegeket! Mit tapasztalsz? Több sor begépelése után lépj ki a more-ból a szokásos módon! Listázd ki a mappa tartalmát! Mit tapasztalsz?

Előfordulhat, hogy a mappa, amelyben épp vagy, írásvédett. Ekkor hibaüzenetet fogsz kapni. Ha kell, keress másik mappát, amelyben dolgozni fogsz: pl. a C:\USER. Kérd a laborvezető segítségét!

Írd be:

more < szoveg.txt

Most mit látsz? Figyeld meg, hogy most nem kellett Ctrl+Z-t írni a kilépéshez, mert a more a szoveg.txt fájl tartalmát jelenítette meg.

Magyarázat: A konzolos programok a felhasználókkal a szabványos bemenet (standard input) és a szabványos kimenet (standard output) segítségével kommunikálnak. A szabványos bemenet alapértelmezés szerint a billentyűzet, a szabványos kimenet pedig a képernyő. Ezek azonban, a fenti módon, átirányíthatók. A programok nem is tudják, hogy valójában honnan olvasnak és hová írnak, billentyűzetről/képernyőre, vagy fájlból/fájlba.

Tipp: ha egy régebben beírt parancshoz hasonlót szeretnél újra beírni, akkor a felfelé nyíl billentyűt használva visszakeresheted a régebben beírt sorokat.

Ha a

more >> szoveg.txt

parancsot írod, a szoveg.txt fájl végéhez fűzi az újonnan beírt szöveget (egy > esetén törli a korábbi szoveg.txt-t, ha volt olyan). Ha nem létezett a szoveg.txt, mindkét esetben létrehozza.

A programoknak a szabványos kimenet mellett van egy szabványos hibakimenete is, a hibaüzeneteket ide szokták írni. Alapértelmezés szerint ez is a képernyőre kerül kiírásra. Ha a program kimenetét átirányítjuk, pl. more nincsilyen.txt > szoveg.txt, és a more valami hibaüzenetet szeretne közölni, akkor a hibaüzenet továbbra is a képernyőn jelenik meg, nem kerül a fájlba. Ha a hibaüzenetet szeretnénk fájlba írni, akkor azt a 2> átirányítással adhatod meg:

more 2> hiba.txt

Megjegyzés. A konzol ablakban nem működik a Ctrl+C másolás és Ctrl+V beillesztés (emlékezzünk, hogy a Ctrl+C a programok leállítására használható). A konzol ablak keretére jobb egérgombbal klikkelve a Szerkesztés menüpontban találod meg a keresett funkciókat. A Megjelölést kiválasztva egérrel tudod kijelölni a vágólapra másolandó szövegrészt, a másolás maga a kijelölés után az Enter leütésével történik. Ugyancsak ebben a menüben, a Tulajdonságok pont alatt tudjuk megváltoztatni például a konzolablak méretét (alapértelmezés szerint 80×25 karakter).

Tipp: ha egy meglévő fájl nevét nem szeretnéd végig begépelni, akkor kezdd el az első pár betűvel, és utána nyomd meg a Tab billentyűt. Erre a Windows parancssora ki fogja egészíteni a fájlnevet. Pl. a szoTab olyan lesz, mintha beírtad volna, hogy szoveg.txt.

Windows pipe

Írd be, hogy

cd c:/Windows/System32
dir

Túl sok fájl neve került kiírásra. A more parancs igazi funkciója, hogy egy szöveget képernyőnyi részekre osztva jelenítsen meg. Használd ezt a mappa tartalmának kilistázására (a | az AltGr+W kombinációval érhető el):

dir | more

A bemutatott módszer a csővezeték (pipe): az egyik program kimenete adja a másik program bemenetét, vagyis ezúttal is a szabványos kimenet és bemenet átirányításáról van szó.

A more programban szóköz-t leütve egy képernyőnyivel tovább haladhatsz. Ha csak egy sornyit akarsz léptetni, üss Enter-t! Kilépni a Q billentyű lenyomásával lehet.

5Programok paraméterei

A legtöbb konzolalos kalmazás, de gyakran az ablakozó programok is, kaphatnak paramétereket. Ezeket hívjuk parancssori paraméternek. Például a cd .. parancsnál a .. a paraméter. Próbaképp írd be az alábbi sort. Mit tapasztalsz?

notepad szoveg.txt

Egy programnak tetszőleges számú parancssori paramétere, más néven parancssori argumentuma (command line argument) lehet. Ezeket a program neve után írjuk, és szóközzel választjuk el egymástól.

Ha paraméterként fájlt adunk meg, és az útvonalban vagy a fájlnévben szóköz van, normál esetben a Windows a szóközzel elválasztott elemeket külön paraméternek tekintené, ezért kell ilyenkor idézőjelek közé tenni azt. Pl.:

notepad "c:\Users\111111\c labor\szoveg.txt"

A more parancs kicsit kilóg a sorból. Ez parancssori paraméterként is kaphatja egy szövegfájl nevét, amit megjelenít. Vagyis az alábbi két parancs egyformán viselkedik. Ez azonban nem általánosítható!

more szoveg.txt
more < szoveg.txt

Egyes parancsoknak, mint pl. a dir-nek is, ún. wildcard-okkal megadott fájlneveket is lehet adni paraméterként. Pl. az alábbi sor csak az .exe kiterjesztésű fájlokat listázza:

dir *.exe | more

Megjegyzés: A ? karakterrel egy, a * karakterrel több karaktert helyettesíthetünk a névben. Pl.:

dir x*e

kilistázza az x-szel kezdődő, e-re végződő fájlokat. Akár több * is lehet:

dir x*py*e

A kérdőjel használata:

dir C_85?.NLS

6Fájlok másolása, mozgatása és törlése

Lépj vissza a clabor mappádba, majd készíts másolatot a szoveg.txt-ről:

copy szoveg.txt szoveg.txt.old

Hozz létre egy uj nevű mappát, és tedd át ide a szoveg.txt-t!

md uj
move szoveg.txt uj

Lépj az új mappába, majd töröld a szoveg.txt-t:

del szoveg.txt

Lépj vissza a clabor mappába, majd nevezd át az old fájlt:

move szoveg.txt.old szoveg.txt

Átnevezésre a rename vagy ren parancs is használható, de azzal más helyre mozgatni nem lehet.

7A Code::Blocks fejlesztőkörnyezet

Az integrált fejlesztőkörnyezetek (integrated development environment, IDE) a programok fejlesztését – készítését, tesztelését, hibakeresését segítő programok. A C nyelv szabványos és elterjedt volta miatt rengeteg ilyen készült hozzá. A Prog1 tárgyban az ajánlott fejlesztőkörnyezet a Code::Blocks nevű, ingyenesen letölthető szoftver, ami megtalálható a HSzK gépein is.

Indítsd el a Code::Blocks programot! Válaszd ki a File menü New/Project… menüpontját! Az alábbi ábrákon látható módon folytasd a projekt létrehozását! Figyelj minden részletre!

  • A projekt típusának válaszd ki a Console application-t. Nyomd meg a Go gombot.
  • A következő oldalon a programozási nyelvet kell megadnod. Ez legyen a C.
  • Ezután arról érdeklődik a Code::Blocks, hogy mi legyen a projekt neve. Írd be, hogy „elso”. Alatta kell beállítanod azt a mappát, ahol a projekt fájlok tárolódnak. Ha ez üresen van hagyva, akkor válaszd ki a ... gombot megnyomva a Dokumentumok mappádat. (Jegyezd meg a mappa elérési útját!) Fontos: a projekt neve, se elérési útja ne tartalmazzon ékezetes betűket!
  • A negyedik ablakban a fordítóprogramot lehet megadni. Ha nem a „GNU GCC Compiler” van kiválasztva, akkor válaszd azt, továbbá ha a „Create "Debug" configuration” nem lenne beikszelve, akkor azt javítsd ki. De ezek így szoktak lenni.
  • Ezzel létre is jött a projekt. A bal oldalon, a „Management” résznél láthatóak a hozzá tartozó fájlok. A „Sources” mappát kinyitva megtalálod a fő programmodult, a main.c-t. Ebben egy helló világ program van. Fontos: a megadott mappanév ne tartalmazzon ékezetes betűket! Sok program ezeket nem szereti.
  • Az AltGr-probléma

    Előfordulhat, hogy a Code::Blocks Windowson az AltGr+G billentyűkombinációra a magyar billentyűzeten ] karakter írása helyett a „Go to function” ablakot nyitja meg. Ennek az a szerencsétlen oka, hogy a Windows nem különbözteti meg az AltGr-t a Ctrl+Alt együttes megnyomásától. Próbáld ki a programkódnál! Ha így tesz, ez a Settings/Editor… menüpont alatt a gyorsbillentyű kikapcsolható:

8Helló Világ

A Code::Blocks eleve úgy hozta létre a projektet, hogy egy egyszerű helló világ programot tett bele. Ha másik fejlesztőkörnyezetet használsz, akkor másold be ezt a C programot (kettőt kattintva a kódra kijelölheted az egészet):

#include <stdio.h>

int main(void) {
    printf("Hello world!\n");
    return 0;
}

A programkódot egyelőre nem kell értened. Annyit csinál, hogy kiírja az ablakba: „Hello world”. A továbbiakban azt fogjuk megfigyelni, hogy a fejlesztőkörnyezet által létrehozott saját programunk ugyanúgy működik, mint a többi parancssori alkalmazás: tartozik hozzá egy .exe fájl, és fájlba irányítható ennek is a kimenete.

A programodat a „Build and run” (zöld play gomb + sárga fogaskerék) gombra kattintva indíthatod el, vagy a Build/Build and run menüpontot választva. Ilyenkor előbb lefordítja a gép, és aztán el is indítja. Ennek eredménye így kell kinézzen.

A futtatható program

Keresd meg a lefordított programot a számítógépen! Ez valahol abban a mappában lesz, amelyiket kiválasztottad a projekt létrehozásánál.

Nyiss egy parancssori ablakot (cmd), és a tanult módon navigálj el ebbe a mappába. A main.c mellett néhány másik fájlt is fogsz találni. Lesz egy bin nevű mappa is, azon belül pedig a Debug. És még azon belül – ott a lefordított program, az elso.exe. Indítsd el!

A lefordított program egy fájl, amely tartalmazza azokat a számítógépnek szóló utasításokat, amelyek végül kiírják a kívánt szöveget; és még egy sor egyéb dolgot, amelyek az operációs rendszernek kellenek. Az ilyet futtathatónak szokás nevezni (vagy a szakzsargonban binárisnak, binary). Ilyen fájlokat tartalmaznak a programok telepítői is (installer). A lefordított program emberi fogyasztásra már alkalmatlan. Próbáld meg kiíratni a tartalmát a type (Linuxon: cat) paranccsal, látni fogod.

Tipp: ha nem emlékszel a mappa nevére, meg tudod keresni. A Code::Blocks az ablakának bal oldalán sorolja fel a projekthez rendelt fájlokat, a „Management/Project” sávon. Itt van a main.c nevű is. Jobb klikk, „Properties…”: a „File name (absolute)” résznél látod a fájl teljes elérési útját, mappákkal együtt:

  • C:\Documents and Settings\Név\Dokumentumok... – Windows XP.
  • C:\Users\Név\... – Windows 7.
  • /home/név/... – Linux.

A kimenet átirányítása

Irányítsd át az előző laboron tanult módon, a > karakterrel a programod kimenetét egy hello.txt nevű fájlba! Írasd ki a keletkező szövegfájlt a type paranccsal!

Láthatod, hogy a programod ugyanúgy viselkedik, mint a többi parancssori program – alapértelmezés szerint a konzol ablakba kerül a kimenete, de kérésre át is lehet irányítani azt fájlba. Ezt az operációs rendszer intézi, és a programot nem kell módosítani hozzá. Ezek a konzolos, vagy más néven parancssori programok; a projekt létrehozásánál éppen azt adtuk meg a típussal, hogy ilyet szeretnénk írni.