Sziasztok!
Van arra valami API, módszer, ötlet, hogy egy program megtalálja az őbenne nyitva levő összes filédescriptort? Pl. a fork és exec között le kell zárni az összes descriptort kivéve néhány konkrétan megadott darabot, amiket viszont örököltetni kell.
Köszi.
- 1022 megtekintés
Hozzászólások
Nézelődök ilyen helyeken, és nagyon elkeserítő dolgokat látok. Az MS elkezdte deprecateddé tenni a POSIX függvényeket. El vagyok maradva. Francba.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
SetHandleInformation, HANDLE_FLAG_INHERIT
- A hozzászóláshoz be kell jelentkezni
Ezt is ismerem, kösz.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
MS elkezdte deprecateddé tenni a POSIX függvényeket.
cygwin alatt anno (1-2 eve) teszteltem hasonlo progikat, amik sok effele dolgot (fork(), dup/dup2(), exec*(), select(), ...) hasznaltak, azalatt teljesen jol ment minden. ms-e'kne'l a select() is a winsock api-ban mutatkozott be eloszor, jot mosolyogtam ;) szoval az tenyleg messze all a szabvanytol, enyhen szolva.
- A hozzászóláshoz be kell jelentkezni
Itt konkrétan arról van szó, hogy az MS doksiban leírják, a POSIX close deprecated, használj helyette _close-t.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
fcntl, FD_CLOEXEC
- A hozzászóláshoz be kell jelentkezni
Ezt használom, de itt nem ismert, hogy milyen fd-k vannak.
Amire gondolok, hogy 0-tól egyesével mindent lezárok, kivéve, ami kell. Kicsit durva, de Linuxon megy.
Na ezért kezdtem nézegetni, hogy mi a helyzet a close-zal úgy általában, mire azt látom az MS-nél, hogy a close deprecated, nem is beszélve a hülye hibakezelésről, aminek az a defaultja, hogy elindítja a Watsont.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
> de itt nem ismert, hogy milyen fd-k vannak.
Akkor legyen ismert.
- A hozzászóláshoz be kell jelentkezni
Itt egy link, amiből látszik, hogy másnak is van ilyen problémája. Többszálú program szálai indítgatnak gyerekeket, és nyitogatnak socketeket, pipeokat. Tehát, hogy egy gyerek indításakor éppen mik a nyitott fd-k, az egyáltalán nem egyszerű. Bonyolult szinkronizációra van szükség. Itt hiányosnak látszik a POSIX API.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
fork() után getrlimit(RLIMIT_NOFILE,...) -ig close() egy ciklusban, oszt el van intézve. :-)
- A hozzászóláshoz be kell jelentkezni
8*sizeof(fd_set) :] ez a `max file desc per process` valtozo elegge bele van vasalva a kernelbe, ha jol tudom.
- A hozzászóláshoz be kell jelentkezni
Nem kell jól tudni, meg is lehet nézni.
- A hozzászóláshoz be kell jelentkezni
Ha feljebb mész a fában, akkor látod, hogy én is gondoltam erre. Két lehetőség volna:
1) fork és exec között mindent lezárni (mint fenn). Ennek még vannak bajai: Windowson nincs ilyen. Ha csak a UNIX-ot nézem, ott is veszélyes (többszálú programban).
2) open/socket/accept/pipe után closeonexecflag, plusz szinkronizálás. Szinkronizálás azért kell, mert az open és a closeonexecflag beállítás között másik szálból gyerek indulhat. Erre írták, hogy kellene egy open_noinherit függvény.
A másodikat választom. Persze a closeonexecflag beállítás is máshogy van Windowson, de az csak kis különbség, nem úgy mint a fork. Na és a child indítás előtt az örököltetni kívánt fd-k closeonexecflagjét ki kell kapcsolni, utána meg vissza.
Köszönöm a segítséget.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
> az open és a closeonexecflag beállítás között másik szálból gyerek indulhat.
Ha a hálózati kapcsolatokat shutdown()-al zárod le, akkor nem számít, hogy egy gyerek örökölte-e a kapcsolatot, vagy sem. Helyi fájlok esetén pedig akkor számít az fd öröklés, ha a gyerek túl sokáig fut, és a nyitva maradt fd-k valami problémát okoznak.
- A hozzászóláshoz be kell jelentkezni
close-zal zárom le.
Nem az kell, hogy a gyerek semmit ne örököljön, hanem azt kell örökölnie, ami az övé, a más gyerekekhez tartozót meg nem. A gyerekek egymást átfedő véletlenszerű időintervallumokban léteznek.
Tényleg nem nagy ügy az se, ha esetleg mindent hagynék örökölni. De nem én fogom írni a gyerekeket, és jobb, ha minél kevesebb galibát tudnak okozni azzal, hogy beleírnak egy véletlenül örökölt nyitott fd-be (amivel elrontják a többiek környezetét).
Lényegében kész van.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
de itt nem ismert, hogy milyen fd-k vannak.
egy fe'lga'ny megoldas, hogy fstat()-tal lekersz valami statuszt, oszt ha az nem sikerul, akkor az fd nem letezik...
A.
- A hozzászóláshoz be kell jelentkezni
Talán közvetlenül a file-ok, pipe-ok, socketek megnyitása után kellene beállítani...
- A hozzászóláshoz be kell jelentkezni
Linux alatt: /proc/self/fd/*, ezek a megnyitott fileokra mutato symlinkek, mas unix-on pedig (egyeb) specialis fileok (is lehetnek).
fork és exec között le kell zárni az összes descriptort
szerintem inkabb jegyezd meg, hogy kiket nyitottal meg, oszt azokat zard be, ma'rha te irod a teljes programot.
A.
- A hozzászóláshoz be kell jelentkezni
> szerintem inkabb jegyezd meg, hogy kiket nyitottal meg, oszt azokat zard be, ma'rha te irod a teljes programot.
+1
- A hozzászóláshoz be kell jelentkezni