1. feladat
Rendszerhívások
Feladva okt. 03. - okt.09., 2011
Határidő okt. 22, 2011
Egyetlen állományt kell feltölteni (C-ben írt forráskód).
Í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...)