Normalerweise verwende ich nur C / C ++, aber ich hatte die Möglichkeit, mir beim Debuggen Sorgen über die geringere Implementierung der Java-Anwendung zu machen (Ich habe Java nicht berührt, es tut mir leid, wenn ich einen Fehler gemacht habe.)
Es scheint, dass "ProcessBuilder" verwendet wird, wenn ein externes Programm in Java ausgeführt wird. Zu diesem Zeitpunkt wird ein untergeordneter Prozess erstellt, und ich habe auf der Quellenebene überprüft, ob der untergeordnete Prozess dem untergeordneten Prozess unter Linux ähnlich ist.
Jemand untersuchte etwas Ähnliches, also zitierte ich auf halbem Weg.
java.lang.ProcessBuilder.start(…) //Betriebssystem gemeinsam
→ java.lang.ProcessImpl.start(…) //Klasse für UNIX OS(Unter dem Solaris-Ordner)
→ java.lang.UnixProcess.<init> // UNIXProcess.java.linux
--------------------Native Code von hier(C Sprache) ---------------------
→ Java_java_lang_UNIXProcess_forkAndExec(...)
(Vfork am Ende dieser Funktion()Ist fertig)
Zitat: Einblick in das ProcessBuilder-Apprentice-Programmiertagebuch
Wie oben wird schließlich der C-Code für jede Plattform aufgerufen. Informationen zur Plattformabstraktionsschicht von JDK einschließlich JNI von Coco et al. Siehe die folgenden Artikel. C-API, die die Plattform abstrahiert (Java) - Qiita
Bei OpenJDK8 lauten die spezifischen Quellen wie folgt. (Linux, aber der Pfad ist unter Solaris enthalten)
jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c
Ich wusste es zum Zeitpunkt des Namens Java_java_lang_UNIXProcess_forkAndExec
, aber fork => exec.
Genauer gesagt sieht es so aus, als ob vfork
=> execve
unter Linux.
Zusammenfassend konnte ich bestätigen, dass das Erstellen eines untergeordneten Prozesses mit Javas "ProcessBuilder" eine Implementierung eines allgemeinen Linux-Prozesses ist.
Einblick in das ProcessBuilder-Apprentice-Programmiertagebuch jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c C-API, die die Plattform abstrahiert (Java) - Qiita
Recommended Posts