Van egy listener (C program), ami az accept-bol kap egy socketet. Ezutan el kell inditani egy Java child processt ugy, hogy az orokolje az elobbi socketet. Meg lehet ezt csinalni?
- 1553 megtekintés
Hozzászólások
Természetesen, a gyermek processz (esetedben a JVM) örökli a szülő file-descriptorait (ha UNIX-ról beszélünk, akkor biztos;), csak az a kérdés hogyan fér hozzá a gyermek ehhez az örököld fd-hez.
A szokásos módszer az, a gyermek szabványos ki és bemenetét a socket-be irányítjük . Így működnek például az inetd-vel indított hálózati szolgáltatások.
- A hozzászóláshoz be kell jelentkezni
Hat igen, hogyan fer hozza? Latom, hogy van egy System.inhertitedChannel API, de nem jovok ra, hogyan lehet hasznalni.
- A hozzászóláshoz be kell jelentkezni
Reméljük, azóta haladtál a problémával...
- A hozzászóláshoz be kell jelentkezni
Ne haragudj, de nem érdemi a hozzászólás. Kifejtem tehát részletesebben a kérdést.
Linuxon (POSIX rendszereken) az fcntl(fd,FD_SETFD,FD_CLOEXEC) hívással lehet szabályozni, hogy egy leíró öröklődjön vagy ne. Tfh örökődik. Az fd egy int szám, a child processz megkapja ezt az int-et, mondjuk parancssori argumentumként.
Ha a child processz C-ben van, akkor az így kapott leíró rögtön használható, pl. write(fd,...).
Ha viszont a child Jávában van, akkor az fd int-ből kell csinálni egy olyan socket objektumot, ami éppen az fd leíróval azonosított socketbe ír. A kérdés, hogyan kell ilyen socket objektumot csinálni.
- A hozzászóláshoz be kell jelentkezni
Segíteni nem tudok, de javaslom, tedd fel kérdésed a http://www.javaforum.hu oldalon is, mert elég sok Java guru jár-kel már az oldalon.
- A hozzászóláshoz be kell jelentkezni
Ez tuti, hogy a Java standard könyvtáraival nem oldható meg, mivel nem platform független a dolog.
Nem elég, ha a C programodban a standard input-outputra irányítod a socketet, és azzal hívod meg a Java programot? Mert ez az, amit még el tudok képzelni, hogy óriási belehekkelések nélkül meg lehet csinálni.
Esetleg egy másik socketre belépni, ahol a Java program fut, és minden forgalmat továbbítani (mint a redir daemon Linuxon). Szóval ha nem fontos a hatalmas teljesítmény én ilyesmit javasolnék.
- A hozzászóláshoz be kell jelentkezni
Meg lehet csinálni. Kulcsszavak: SelectorProvider. DefaultSelectorProvider. NIO.
- A hozzászóláshoz be kell jelentkezni
Még valami eszembe jutott, ha már említettem a teljesítményt:
Abban az esetben ha inkább sok, mint nagy volumenű kérés kiszolgálása a feladat, okosabb egyetlen java processzel kiszolgálni, mint minden kérésre új JVM-et indítani. A JVM indítás overheadje elég nagy (sőt amennyire tudom a JVM-ek nem tudják shared memoryban tartani a közös jar osztálykönyvtárakat, így mind le fogja foglalni a maga tetemes memóriáját), míg egy port redirect-et elég olcsón meg lehet úszni.
- A hozzászóláshoz be kell jelentkezni
> Nem elég, ha a C programodban a standard input-outputra irányítod a socketet, és azzal hívod meg a Java programot? Mert ez az, amit még el tudok képzelni, hogy óriási belehekkelések nélkül meg lehet csinálni.
Én is ezt javasoltam annak idején, de nem mondott rá se bűt, se bát...
- A hozzászóláshoz be kell jelentkezni