Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  2.2.1 Verwendung von.

Ähnliche Präsentationen


Präsentation zum Thema: "Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  2.2.1 Verwendung von."—  Präsentation transkript:

1 Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  2.2.1 Verwendung von C-Funktonen in Java Programmen  2.2.2 Zugriff auf Methoden von Java-Objekten in nativem Kode  2.2.3 Zugriff auf Attribute von Java-Objekten in nativem Kode  2.2.4 Ausnahmebehandlung  2.2.5 JNI in Multithread-Anwendungen  2.2.6 Aufruf der JVM in nativen Anwendungen

2 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung  Der vom Betriebssystem initiierte Prozess, der durch den Aufruf eines Java- Programms, erzeugt wird, hat eine Ablaufumgebung, auf die das Java- Programm zugreifen kann.  Der Zugriff erfolgt über Objekte der Klassen Process und Runtime, die von der JVM instanziiert werden.  Die aktuelle Umgebung eines Java-Programms erhält man durch Aufruf der Methode getRuntime, die ein Process-Objekt zurück liefert  Dieses Objekt hat Zugriff auf die Standard-Ein- und -Ausgabe und Fehler- Ströme der Ablaufumgebung.  Beispiel: Java-Programm, das ein Betriebssystem-Kommando ausführt

3 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung 1. // Exec.java 2. import java.io.*; 3. public class Exec { 4. public static void main(String args[]) { 5. try { // create new process, exec command and print output 6. // of command line by line 7. String line; 8. Process p = Runtime.getRuntime().exec(args); // new process 9. BufferedReader in = // pipe with stdout 10. new BufferedReader // from p 11. (new InputStreamReader(p.getInputStream())); 12. while ((line = in.readLine()) != null) { 13. System.out.println(line); 14. } 15. in.close(); 16. } 17. catch (Exception err) { 18. err.printStackTrace(); 19. } 20. } // main 21. }

4 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung 1. // Exec.java 2. import java.io.*; 3. public class Exec { 4. public static void main(String args[]) { 5. try { // create new process, exec command and print output 6. // of command line by line 7. String line; 8. Process p = Runtime.getRuntime().exec(args); // new process 9. BufferedReader in = // pipe with stdout 10. new BufferedReader // from p 11. (new InputStreamReader(p.getInputStream())); 12. while ((line = in.readLine()) != null) { 13. System.out.println(line); 14. } 15. in.close(); 16. } 17. catch (Exception err) { 18. err.printStackTrace(); 19. } 20. } // main 21. } $ java Exec ps -ao "pid ppid command" PID PPID COMMAND 771 685 login -pf as 772 771 -bash 935 772 java Exec ps -ao pid ppid command 936 935 /bin/ps -ao "pid ppid command" $

5 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung  Genauso, wie das Java-Programm lesend mit einem erzeugten Prozess kommunizieren kann, ist es auch möglich, die Standardeingabe eines erzeugten Prozesses mit Daten zu bestücken.  Beispiel: Arithmetischen Ausdruck vom Programmaufruf senden an bc, das den Ausdruck auswertet und das Ergebnis wieder an das Java-Programm mit dem o.a. Mechanismus zurückgibt.  Verwendet wird das Gegenstück zu getInputStream(), die Methode getOutputStream(), um dem Prozess über seine Standard-Eingabe Daten zu senden. $ java Bc (0.8+0.2)*5*2 10 $

6 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung 1. // Bc.java 2. import java.io.*; 3. public class Bc { 4. public static void main(String args[]) { 5. try { // create new process, exec bc and print output 6. String line; 7. Process p = Runtime.getRuntime().exec("bc"); // new process 8. BufferedReader in = // pipe with 9. new BufferedReader // stdout from p 10. (new InputStreamReader(p.getInputStream())); 11. BufferedWriter out = // pipe with 12. new BufferedWriter // stdin from p 13. (new OutputStreamWriter(p.getOutputStream())); 14. out.write("scale=2\n"); // some inits for bc 15. out.write(args[0],0, args[0].length()); // expression 16. out.write(’\n'); // bc starts eval 17. out.flush(); 18. out.close(); // bc is waiting to read from pipe 19. // program would hang iff not closed 20. // because in.readLine could not terminate 21. while ((line = in.readLine()) != null) { 22. System.out.println(line); 23. } 24. in.close(); 25. } catch (Exception err) {err.printStackTrace(); } 26. } // main 27. } $ java Bc (0.8+0.2)*5*2 10 $

7 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung  In Unix wird jedem Prozess ein Exit-Status zugeordnet, der Auskunft über die Art der Termination des Prozesses gibt. Der Integer-Wert Null bedeutet dabei normalerweise, dass ein Prozess fehlerfrei terminiert, ein von Null verschiedener Wert drückt eine Beendigung im Fehlerfall aus. Ein Java-Programm kann auf den Exit-Status des von ihm erzeugten Prozesses mit der Methode exitValue der Klasse Process zugreifen.  Eine weitere Methode dieser Klasse ( destroy ) erlaubt es, einen erzeugten Prozess zu beenden.  Ein Prozess hat eine Ablaufumgebung, in der Umgebungsvariable Werte annehmen können. Z.B. zeigt die Variable HOME in Unix auf das Standard- Verzeichnis eines angemeldeten Benutzers. Durch das Unix-Kommando env kann man sich die Umgebungsvariablen anzeigen lassen. Beispiel: Umgebung des erzeugten Prozesses bestimmen

8 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung 1. // Exec1.java 2. import java.io.*; 3. public class Exec1 { 4. public static void main(String args[]) { 5. StringBuffer cmdLine = new StringBuffer(args[0]); 6. for (int i=1; i<args.length; i++) 7. cmdLine = cmdLine.append(" ").append(args[i]); 8. try { // create new process, exec command and print output 9. String line; 10. // Environment for new process 11. String[] env = {"NAME=as", new String("HOST=hal")}; 12. Process p = Runtime.getRuntime().exec(cmdLine.toString(), 13. env); // Environment 14. BufferedReader 15. input = new BufferedReader 16. (new InputStreamReader(p.getInputStream())); 17. while ((line = input.readLine()) != null) { 18. System.out.println(line); 19. } 20. input.close(); 21. if (p.exitValue() != 0) // process terminated normaly? 22. System.out.println("Command terminated with exit code " + 23. p.exitValue()); 24. } catch (Exception err) {} 25. } 26. } $ java Exec1 env NAME=as HOST=hal $ java Exec1 cat DateiExistiertNicht Command terminated with exit code 1 $

9 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung  Wenn ein Java-Programm ausgeführt wird, so wird es von der JVM in einem Betriebssystemprozess verarbeitet. Jeder Prozess kann asynchron eintretende Ereignisse empfangen. Diese werden je nach Betriebsystem unterschiedlich behandelt. In Unix reagiert ein Prozess auf ein eintreffendes Signal mit einem je nach Signal spezifizierten Default-Verhalten. Will man das Verhalten per Programm beeinflussen, muss man einen Signal- Handler schreiben, der den gewünschten Kode ausführt, wenn ein Signal eintrifft.  Die Behandlung von Signalen im JVM-Prozess erfolgt mehrstufig.  Wenn der JVM-Prozess ein Signal empfängt, wird zunächst geprüft, ob es für diesen Prozess eine eigene Signalbehandlungsroutine gibt.  Ist dies der Fall, wird das Signal durch ihn behandelt, ansonsten wird es an die JVM weitergereicht.  Damit ein Signal von der JVM mit einem in Java geschriebenen Signal-Handler abgefangen werden kann, kann die Klasse sun.misc.Signal verwendet werden. Eine Java Signalbehandlung unterscheidet sich nicht viel von einem Signal-Handler der z.B. in C realisiert ist. Der Unterschied ist, dass ein eintreffendes Signal bewirkt, dass die JVM einen neuen Thread erzeugt, der die Signalbehandlung durchführt.  Beispiel: Abfangen von TERM

10 Alois Schütte Advanced System Programming Interprozeßkommunikation: JVM Ablaufumgebung 1. // SignalDemo.java 2. import sun.misc.Signal; 3. import sun.misc.SignalHandler; 4. class SignalDemo { 5. public static void main(String[] args) { 6. try { // Install signal handler 7. Handler h = new Handler("TERM");// 15 8. while (true) { 9. System.out.println("main"); 10. Thread.sleep(1000); 11. } 12. } catch (Exception e) { 13. System.out.println("AppWrap exception "+e); 14. } 15. } 16. } 17. class Handler implements SignalHandler { 18. Handler (String signalName) { 19. Signal signal = new Signal(signalName); 20. Signal.handle(signal,this); // handle signal 21. } 22. // Signal handler method 23. public void handle(Signal sig) { 24. System.out.println("Signal handler called for signal "+sig); 25. } 26. }

11 Alois Schütte Advanced System Programming Interprozeßkommunikation: JNI


Herunterladen ppt "Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  2.2.1 Verwendung von."

Ähnliche Präsentationen


Google-Anzeigen