Orokolt socket

Fórumok

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?

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.

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.

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.

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.

> 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...