A rövidítés
kényelmes ugyan, csakhogy
máshová vezet.
Gyerekkoromban járta az a vicc, miszerint
- Mi a különbség a hullámvasút és a női mell között?
- Semmi! Mindkettő a gyerekeknek készült, de a felnőttek élvezik.
Nos, hasonlóan sikeres és de félreértelmezett találmánya volt a világnak a linuxos procfile rendszer. Eredetileg afféle üvegzseb projektnek készült, hogy a kernel modulok állapotáról valami közelebbi információt tudhasson meg a kernel kényének-kedvének amúgy is kiszolgáltatott felhasználó. De aztán a ferdehajlamú kernelmodulfejlesztők rátették a kezüket procfile-okra és szép lassan a linuxon a user mode és a kernel mode közötti adatcsere egyik legfőbb csatornája lett. Ezen keresztül lehet bonyolultabb konfigurációs parancsokkal ellátni egy modult, de akár arra is alkalmas, hogy nagyobb mennyiségű adatot kiolvassunk a modulból. A procfile önmagában egy virtuális file, amibe a külső felhasználó bele tud írni tud, vagy olvasni tud belőle. Az íráshoz/olvasáshoz szükséges buffereket és függvényeket a kernel modulnak kell implementálnia. Nos mi egy hálókártyáról érkező forgalmat szűrtünk meg és dolgoztunk fel, amit aztán egy user mode applikáció egy procfile-on keresztül kiolvasott a kernel modulból. A rendszer kiválóan működött egy darabig aztán minden egyéb hibajelzés nélkül leállt a kiolvasás. Jó néhány nap próbálgatás után kiderült, hogy körülbelül 2Gbyte adat kiolvasása után. Gusztustalan furmányok segítségével (időnként lezártuk és újranyitottuk a procfile-t) sikerült áthidalni a problémát, mígnem nemrég rájöttünk a probléma gyökerére. A procfile alapból 32 bites offsettel jött létre és simán túlcsordult a file offset a file írásakor. Kiderült, hogy a proc file létrehozásánal paraméterezhető, hogy 32 vagy 64 bites offsettel jöjjön létre, csak hát a default az a 32 bit volt. Kesőbb láttam, hogy a gcc-t a -D_FILE_OFFSET_BITS=64 definícióval kényszeríteni lehet arra, hogy alapból 64 bites offszeteket használjon.