J'ai besoin d'un appel de fonction "système", identique à ceux de Python, Perl, PHP, Ruby, & c. Ce sera un composant d'une bibliothèque standard JavaScript appelée Narwhal, lorsqu'elle est exécutée sur le moteur JavaScript de Rhino, qui est à son tour exécuté sur Java.Implémentation de la commande "système" en Java
Le problème est que la bibliothèque standard de Java semble avoir éliminé la possibilité de générer un sous-processus qui partage le stdio du processus parent. Cela signifie que vous ne pouvez pas reporter l'interactivité au sous-processus.
Ma première fissure à ce sujet était d'implémenter subprocess.popen de Python. Cela utilise trois threads "pumper" pour copier activement le stdio du processus parent indépendamment (pour éviter les interblocages). Malheureusement, cela nous pose deux problèmes. Premièrement, l'entrée ne se ferme pas automatiquement lorsque le sous-processus se termine volontairement. Deuxièmement, les flux vers le processus enfant ne sont pas tamponnés et ne s'affichent pas correctement.
Je cherche des solutions qui feraient fonctionner notre commande require ("os"). System() comme on pourrait s'y attendre.
Le projet est à http://narwhaljs.org
Code pertinent:
- http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/lib/os.js#L10
- http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/engines/rhino/lib/os-engine.js#L37
Ajout de jni.jar, ce peu de JavaScript a fait l'affaire. Je vous remercie! var jna = Packages.com.sun.jna; var clib = jna.NativeLibrary.getInstance (jna.Platform.isWindows()? "Msvcrt": "c"); var csystem = clib.getFunction ("système"); csystem.invoke (["echo Bonjour, monde!"]); http://gist.github.com/181225 –