J'utilise généralement uniquement C / C ++, mais j'ai eu la chance de m'inquiéter de l'implémentation inférieure de l'application Java lors du débogage, alors notez (Je n'ai pas touché Java donc je suis désolé si j'ai fait une erreur)
Il semble que ProcessBuilder
soit utilisé lors de l'exécution d'un programme externe en Java.
A ce moment, un processus enfant est créé, et j'ai vérifié au niveau source si le processus enfant
est similaire au processus enfant
sous Linux.
Quelqu'un enquêtait sur quelque chose de similaire, alors j'ai cité à mi-chemin.
java.lang.ProcessBuilder.start(…) //OS commun
→ java.lang.ProcessImpl.start(…) //Classe pour UNIX OS(Sous le dossier solaris)
→ java.lang.UnixProcess.<init> // UNIXProcess.java.linux
--------------------Code natif d'ici(Langage C) ---------------------
→ Java_java_lang_UNIXProcess_forkAndExec(...)
(Vfork à la fin de cette fonction()Est fait)
Citation: Aperçu du journal de programmation ProcessBuilder-Apprentice
Comme ci-dessus, le code C de chaque plateforme est finalement appelé. Pour la couche d'abstraction de plate-forme de JDK, y compris JNI de Coco et al., Consultez les articles suivants. API C qui résume la plate-forme (Java) --Qiita
Avec OpenJDK8, les sources spécifiques sont les suivantes. (Linux mais le chemin est inclus sous solaris)
jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c
Je le connaissais à l'époque du nom Java_java_lang_UNIXProcess_forkAndExec
, mais fork => exec.
Plus précisément, il semble que sous Linux, ce soit vfork
=> ʻexecve`.
Donc, en conclusion, j'ai pu confirmer que la création d'un processus enfant avec ProcessBuilder
de Java est une implémentation d'un processus Linux général.
Aperçu du journal de programmation ProcessBuilder-Apprentice jdk8/jdk8/jdk: d94613ac03d8 src/solaris/native/java/lang/UNIXProcess_md.c API C qui résume la plate-forme (Java) --Qiita
Recommended Posts