Adott eszköz (/dev/*) -et maximálisan használó folyamatok száma

Fórumok

Ennek beállítására kellene valami jó kis frappáns megoldás... :)

Adott a következő eset...

Bizonyos eszközöknél problémát jelenthet az, ha egyszerre több folyamat szeretné használni.

Azt kéne megoldani, hogy az adott eszközt maximum 1 darab processz használhassa adott időben.

Pl.: /dev/video0 (tunerkártya)...

crontab-val, at-vel (tökmindegy, vmilyen időzítővel) beprogramozott felvétel elindul a megfelelő időben.

Másik user bejelentkezik és szeretne tévét nézni. És sajnos ilyenkor - képet, hangot nem kap - a csatornaváltás működik, mivel
a /dev/video0 eszközre írási joga van, viszont ez sajnos érinti a felvételt is, "aláváltja" a csatornát, és a felvétel az átváltott tévécsatornáról folytatódik, ami nem kifejezetten kellemes. ;-)

(pl. mencoder vesz fel + mplayer meg szépen aláváltja a csatornát, de gyanítom a használt program tökmindegy. most hogy tvtime-al, vagy mplayer-rel vált alá az kv. mindegy...)

Egyelőre jobb ötletem híján egy olyat gányoltam, hogy bootoláskor folyamatosan fut amúgy is egy szkript (kb. daemon jelleggel "végtelen ciklusban" leállításig) és az megnézi (fuser /dev/video0), hogy használja-e valami az eszközt, és ha igen, akkor leveszi róla (/dev/video0) az írási jogot, így a csatornaváltás sem működik (kép + hang egyébként sincs), ha meg az eszköz felszabadul , akkor visszaírja az írási jogot (ha már egyszer a szkript amúgy is fut, az idejébe mondjuk belefér). namost ez bár megfelelően működik, igencsak gányolás. Tudtok valami más módszert az eszköz "kordában tartására" ?

Hozzászólások

Hm, az a furcsa, hogy nem forditva mukodnek ezek az eszkozok (hogy mindenki olvashatja, viszont csak egyvalaki irhatja: az, aki eloszor irasra nyitja meg).

A kernel is tudja ezt, lehet hogy csak meg kell peccselni a megfelelo modult (/usr/src/linux/drivers/media/video/videodev.c), pl:


...
static int is_device_open=0;
...
static int device_open(struct inode *inode, struct file *file)
{
 static int counter = 0;

 if ( is_device_open ) return(-EBUSY);         /*********/

 MOD_INC_USE_COUNT;

 is_device_open++;
 ...
}
...

(ez kicsit nagypofaju beszolas, mert nem nagyon csinaltam ilyeneket, csak ja'te'k-szinten, pl. amibol ezt a fenti izet kikopiztam <- a lenyeg a /****/ sor, ahol az is_device_open egy modulszintu" belso" statikus valtozo; de a lenyeg, hogy elvileg relative egyszeruen meg /lehetne/ csinalni)

De hogy erdemben is probaljak hozzaszolni: a fenti megoldasnal talan egy fokkal kulturaltabb ga'nyola's, hogy valami pollozo ize'vel (pl. select()) figyeled a /proc/video/dev/ konyvta'r tartalma't, illetve ebben a /dev/video*-nak megfelelo" file-t (/proc/video/dev/video*). Ha a procfs olyan es szerencsenk van, akkor a /dev/video* megnyita'sakor ezen konyvtar es/vagy file megvaltozik, amit a select()-tel tudsz figyelni, es rogton le lehet reagalni.

A.

Ez a kernel hackelés már az én gondolataim között is megfordult, lehet futok majd vele majd egy kört a köv. reviziónál (2.6.18-7 a mostani, úgy egy hónapja), ha jobb nem akad... / ez majd még eldől :-) /

Bár aszittem van valami security cucc - csak én nem találtam meg, mer' lusta béna egyéb jószág vagyok - amivel "egyszerűbben" lehet az eszközök garázdálkodását megregulázni íly módon...

-------

Nem a zsömle kicsi, a pofátok nagy...

Szerintem erre valo a file locking nevu dolog, vagy a lockfile. Persze ez alkalmazas es nem kernel oldali...

Zsiraf

p.l.: info libc 'file locks'