[linux-l] Debian-Mirror der belug...

Steffen Dettmer steffen at dett.de
Fr Okt 10 09:58:53 CEST 2003


* Tobias Schlottke wrote on Thu, Oct 09, 2003 at 11:10 +0200:
> On Wed, 8 Oct 2003, Oliver Bandel wrote:
> > Ist das echt so, daß es unter Java kein fork() gibt?!  Kann
> > man da keine C-Routinen einbinden und das dann darüber
> > realisieren?

Kann man, JNI z.B.: JavaNativeCode interface. Ist dann aber kein
Java, sondern Native Code... :-)

> Nee, gibt's nicht. Du kannst einen anderen Prozess
> starten. Das macht wie gesagt auch nix anderes als ein
> fork und dann ein exec. 

Nun, exec ist recht ungeeignet, find ich. Bei einem setuid-Binary
z.B. werden gedroppte Rechte wieder im Child aktiv :) Alle Daten
sind verloren und müssen auf anderem Weg übertragen werden - wird
ja mindestens umständlich.

Ich hab mal einen super-safe-fork in einem Serversystem mit exec
implementiert (gerade um sicherzugehen, daß alle
filedesscriptoren weg sind etc), es ist wirklich recht nervig.
Man hat ja nur argv und nach dem "fork/exec" ist der control flow
des childs im main...

> Man kann sich selbst also einfach nochmal starten aber das ist
> dann eben aus Java Sicht ein richtig neuer Prozess und hat mit
> dem alten nix mehr gemein.

Kann das wirklich Java, oder ist das irgendeine Erweiterung oder
so? 

> Aber man kann native Code (halt eine shared lib bzw dll unter
> Windows) einbinden.

Klar, man kann mind. in Java ein launcher machen, der über
JNI sshd startet, aber das ist ja nicht gemeint :) Dann kann
man in PostgreSQL auch SSH implementieren (da kann man ja auch
Code reinlinken) :)

Es gibt doch auch kein setuid in Java (oder?).

> <Überleg grübel>, vielleicht sollte man das einfach mal
> ausprobieren wenn man sich ein simplen fork-wrapper schreibt.
> Dann hat man halt zwei virtelle Maschinen die ab dem Zeitpunkt
> X genau den gleichen Zustand haben.

Du meinst, aus dem JNI ganz brutal forken, ja? Ist natürlich mit
Vorsicht zu genießen, klar, auch alle Threads werden kopiert.
Geht vermutlich auch nur in kleinen Anwendungen, wo man noch alle
Threads persönlich kennt :)

> Dann muß man nur dafür sorgen, daß sich Papa und Kind darüber
> einig sind, wer sich um welchen Deskriptor kümmert. Der
> Garbagekollektor räumt Sockets weg ohne sie zu schließen, das
> wär an der Stelle sogar ein Feature und kein Bug.

Warum? Dann wird der Socket ja im jeweils anderen Prozeß nicht
geschlossen und damit später nicht wiederverwendet werden, weil
das OS davon ja nix weiß. Ich find das ist ein Bug.

Hier ist noch das Problem, daß man im Falle eines Sockets den
Filedesriptor in einem Prozeß mit close schließen muß (sonst wird
ja die Verbindung abgebaut) und im anderen mit shutdown (sonst
steht die Verbindung auf der "anderen" Seite ewig) - wüßte nicht,
wie man das in Java hinkriegen könnte (ohne JNI)

> Mmmmhhh....die langen Winterabende kommen ja noch ..
> :-)

:-) Yo. Kann man bestimmt lustige Sachen mit machen :-)

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.




Mehr Informationen über die Mailingliste linux-l