java signale



  • Hi @all,

    ich möchte in einer C-bibliothek, welche über das JNI an meine Javaapplikation angebunden ist, UNIX-Signale verwenden.

    Weiß jemand ob die JVM selbst Signale benutzt, wenn ja welche?

    Wenn ich von außen Signale von aussen an meinen Javaprozess schicke, müssten die doch direkt zum Aufruf meiner sighandler führen, oder pfuscht mir da die JVM noch irgendwie dazwischen?



  • Spezifiziere mal bitte genauer, was du unter Signale verstehst. Falls du so etwas wie ein Event-Modell realisieren willst, bleibt dir vermutlich nicht viel anderes übrig, als die Events über native Methoden zu erfassen.
    Dann kannst du dir Listener-Klassen basteln, die diese Events auswerten. Als Vorbild kann dir dabei Swing dienen.



  • OK, zugegebenermaßen undeutlich ausgedrückt.

    ich meine UNIX signale. Die müssen auch gar nicht mehr hoch in die Javaapplikation.



  • Wenn du Signale an deinen Java-Prozess schickst, bekommt sie logischerweise der Java-Prozess und das ist die VM.

    ich möchte in einer C-bibliothek, welche über das JNI an meine Javaapplikation angebunden

    Klingt für mich so, als würde bei dir ein Prozess names Java Virtual Machine laufen und sonst nichts.
    Keine Ahnung, was die VM mit den Signalen macht.



  • Keine Ahnung, was die VM mit den Signalen macht

    Ich weiß ebenfalls nicht, was die VM damit macht (OK - das Signal sich zu beenden wird sie wohl interpretieren... ) - aber an Java weitergeleitet werden die sicherlich nicht, weil sowas eben einfach plattformabhängig wäre...

    Ich glaube aber zu wissen, dass ich schonmal was von einer nativen lib gelsen habe, mit der man eben solche Signale unter Unix/Linux abfangen kann... (Googeln sollte wie meistens helfen)



  • destruct0r schrieb:

    Keine Ahnung, was die VM mit den Signalen macht

    Ich weiß ebenfalls nicht, was die VM damit macht (OK - das Signal sich zu beenden wird sie wohl interpretieren... ) - aber an Java weitergeleitet werden die sicherlich nicht, weil sowas eben einfach plattformabhängig wäre...

    Verstehe ich nicht? Was hat den das mit Plattformunabhängigkeit zu tun? Die JVM kann doch sehr wohl plattformabhängig sein und in der Unix-Implementation Signale verwenden.

    destruct0r schrieb:

    Ich glaube aber zu wissen, dass ich schonmal was von einer nativen lib gelsen habe, mit der man eben solche Signale unter Unix/Linux abfangen kann... (Googeln sollte wie meistens helfen)

    Ja die gibts. Das ist aber nicht mein Anliegen.

    Noch mal auf den Punkt gebracht:

    Kann ich in einer C-Lib, die über JNI von einem Javaprogramm genutzt wird, ohne Einschränkungen Signale verwenden??



  • Verstehe ich nicht? Was hat den das mit Plattformunabhängigkeit zu tun? Die JVM kann doch sehr wohl plattformabhängig sein und in der Unix-Implementation Signale verwenden.

    Ja, aber du willst ja offensichtlich in deinem Programm die Signale auswerten.
    Und Signale sind nun mal nicht plattformunabhängig, damit ist dein Programm nicht mehr plattformunabhängig.



  • Optimizer schrieb:

    Verstehe ich nicht? Was hat den das mit Plattformunabhängigkeit zu tun? Die JVM kann doch sehr wohl plattformabhängig sein und in der Unix-Implementation Signale verwenden.

    Ja, aber du willst ja offensichtlich in deinem Programm die Signale auswerten.
    Und Signale sind nun mal nicht plattformunabhängig, damit ist dein Programm nicht mehr plattformunabhängig.

    Danke für die Aufklärung...jetzt weiß ich auch warums unter Windows nicht kompiliert!

    Drück ich mich eigentlich so schlecht aus? (ernst gemeinte Frage, soll in keiner Weise zu Provokationen führen)

    Es ist doch durchaus denkbar, dass die Implementation der JVM unter Unix Signalhandler registriert, oder bestimmte Signale zur internen Kommunikation nutzt, oder? Dies würde ich einfach nur gerne vorher wissen um Probleme bei der Verwendung von Signalen in meiner library zu vermeiden.

    Dass das ganze nicht mehr plattformunabhängig ist, interessiert schon aus dem Grund nicht, da das komplette Framework plattformabhängig ist und ausschließlich auf Solariskisten läuft.



  • Es ist doch durchaus denkbar, dass die Implementation der JVM unter Unix Signalhandler registriert, oder bestimmte Signale zur internen Kommunikation nutzt, oder?

    Darum geht es doch nicht. Du willst die Signale _in deinem Programm_ auswerten, wenn ich dich richtig verstanden habe.
    Daraufhin ist die Theorie entstanden, dass die VM die Signale vermutlich nicht an dein Programm weitergibt, weil sie nicht plattformunabhängig sind. Ein Java Programm kriegt halt keine Signale, die von einer bestimmten Plattform abhängen.

    Außerdem meine ich verstanden zu haben, dass dein Programm im Großen und Ganzen ein Java-Programm ist und lediglich per JNI ein paar Native Methoden aufruft. Damit trifft der obige Punkt auf dein Programm zu.

    Zusammenfassend lässt sich unter den genannten Annahmen feststellen, dass bei dir ein einziger Prozess läuft: die JVM.
    Und dass diese vermutlich aus genannten Gründen keine Signale weiterleitet.

    Wohlgemerkt alles Theorie und basiert auf einigen Annahmen.



  • Optimizer schrieb:

    Zusammenfassend lässt sich unter den genannten Annahmen feststellen, dass bei dir ein einziger Prozess läuft: die JVM.
    Und dass diese vermutlich aus genannten Gründen keine Signale weiterleitet.

    weitergeleitet muss da nichts werden. Sie sollen nur nicht abgefangen werden.
    So lange die JVM keine signalhandler registriert und dann die Signale abgfängt oder solange die JVM nicht durch meine Signale gestört wird ists ja in Ordnung.

    Optimizer schrieb:

    Wohlgemerkt alles Theorie und basiert auf einigen Annahmen.

    Im Netz hab ich einen Beitrag gefunden, der meinte, dass bei ihm Java RMI nicht mehr funktioniert als er die USRx Signale selbst verwendete.
    Gerade eben nochmal nach langer suche bin ich auf folgendes gestoßen:

    http://java.sun.com/j2se/1.4.2/docs/guide/vm/signal-chaining.html

    Des Weiteren hab ich noch gelesen, dass die JVM unter HP-Unix (was mich nur peripher tangiert) folgende Signale nutzt:

    SIGSEGV
    SIGALRM
    SIGPIPE
    SIGBUS
    SIGILL
    SIGFPE
    SIGUSR1
    SIGQUIT

    Dies lässt aber darauf schließen, dass die JVM unter solaris ähnlich viele Signale benutzt.


Anmelden zum Antworten