1. feladat
Feladva szept. 28. - okt.04., 2009
Határidő okt. 17, 2009
Rendszerhívások
Egyetlen állományt kell
feltölteni (C-ben írt forráskód), neve S01_xxxxxxx.c ahol xxxxxxx - felhasználó azonosítója a linux
szerveren.
Írjunk C programot, mely paraméterként
megadott állományneveket keres a felhasználó keresési útvonalában ($PATH)
megadott katalógusokban.
A parancssor minden egyes
paraméterére megvizsgálja a keresési útvonalban szereplő összes katalógust,
hogy van-e benne az adott paraméterrel megegyező nevű állomány.
A program kezelje az
esetleges hibákat.
Megjegyzések:
- Minden megadott
paraméter esetén, a keresési útvonalban szereplő minden katalógusra az
ls -l <katalógusnév>/<paraméter>
parancsot kell végrehajtani. A parancs végrehajtására ne a popen vagy system függvényeket használjuk, hanem az
exec függénycsalád valamelyikét.
(ti. a popen
és system is ezeket használja)
- a környezeti
változókhoz C programból
való hozzáférés lehetőségéről (lásd: getenv függvény), illetve az exec függvénycsalád használatával
kapcsolatban lásd a folyamatkezelés-ről szóló
dokumentációt, illetve
a man-t.
- Mivel a legtöbb
állomány a keresési útvonalban megadott egyetlen katalógusban szerepel csupán, az "ls
-l" parancsok jó részének kimenete a "No
such file or directory" üzenetet tartalmazná.
Szűrjük ki ezeket a sorokat úgy, hogy a program csak azokat írja
ki, amelyek a létező állományokról nyújtanak információt (a
hibacsatorna átirányítása a dup vagy dup2 függvény segítségével oldható meg).
- A keresési
útvonalról (csupán ismétlés kedvéért): katalógusok listáját tartalmazza. Ezekben szerepelnek azok a parancsok (végrehajtható programok), amelyeket lehet, hogy végre szeretnénk hajtani. Amikor a parancssorba beírok egy parancsot, a shell végigkeresi azokat a katalógusokat, amelyek a keresési útvonalban szerepelnek, a megadott nevű állományt keresve bennük. A keresést a keresési útvonalban megadott sorrendben végzi, és végrehajtja a legelső megfelelő nevű állományt, amit megtalál (nem mindegy tehát, hogy a keresési útvonalban milyen sorrendben szerepelnek a katalógusnevek,
ugyanis megtörténhet, hogy egy állomány
több helyen is szerepel, de nem az lesz végrehajtva,
amit én szeretnék, hanem az első, amit
a shell megtalál). Amennyiben
nem találja meg az állományt
egyik katalógusban sem, egy ennek
megfelelő hibaüzenetet
ír ki.
Tippek / gyakori hibák
- a mutatóknak kötelező módon helyet kell foglalni (ez az összes
feladatra érvényes), különben nemvárt mellékhatások jelenkezhetnek
("jobb esetben" segmentation fault-al végződik a program)
- minden egyes megadott
paramétert össze kell kombinálni a PATH változóban szereplő minden egyes
elérési úttal
(=> az ls parancsot "param_szam *
PATH-ben_adott_eleresi_utvonalak_szama"-szor kell végrehajtani)
- mivel az exec függvénycsalád
bármelyikének meghívásakor a hívó folyamat kontextusa felcserélődik az
exec fg. által futtatott folyamat kontextusával, ezért az exec-et célszerű
egy gyerekfolyamatban futtatni, amennyiben azt szeretnénk, hogy a
folyamatunk folytatódjon
- az exec függvénycsalád esetén a
paraméterek megadását a 0. paraméterrel kell kezdeni, ami a végrehajtandó
parancs neve.
- az exec függvénycsalád esetén
az utolsó paraméter a NULL paraméter kell legyen
- vigyázat! A
path=getenv("PATH")
parancs eredményeképpen a path változó a PATH környezeti változó
adatterületére fog mutatni (ahelyett, hogy átmásolódna a PATH változó
értéke arra a helyre, ahova a path változó mutatott -, amit valószínűleg
szeretnénk...)