Rufen Sie ein externes Programm aus OCaml
Frage
Ich bin ziemlich neu in OCaml und versuchte herauszufinden, wie aus OCaml ein externes Programm aufzurufen.
Ich habe nach der Dokumentation hier und den folgenden Aufruf machen:
Unix.execv "cat text_file";;
Das gibt die folgenden:
string array -> 'a = <fun>
Wie genau greife ich auf die zurück anonyme Funktion?
cat text_file
ein einfacher Versuch, den Inhalt der Datei zu drucken, der Befehl, den ich tatsächlich ausgeführt werden soll ist ein wenig komplex. Ich nehme jedoch, dass, wenn ich diese zum Laufen bringen kann, soll ich in der Lage sein, mein wirkliches Programm zum Laufen zu bringen.
Lösung
Das erste Argument für execv
ist das Programm, das Sie ausführen möchten und das zweite ist ein Array, das die Argumente enthält. Auch execv
erfordert den vollständigen Pfad zu dem Programm; Sie können execvp
zu sehen, das Programm in dem Ausführungspfad verwenden. Des Weiteren ist das erste Argument für das Programm ist der Name des Programms selbst.
So Sie "/bin/cat"
als erstes Argument wollen, nicht "cat text_file"
und [| "cat"; "text_file" |]
als zweites Argument (oder Anruf execvp
und "cat"
als erstes Argument übergeben).
Doch mehr als oft nicht Sie tatsächlich system
wollen, nicht execv
.
Beachten Sie, dass system
ermöglicht es Ihnen, einen einzelnen String zu übergeben, wie Sie wollen, und dass execv
(im Gegensatz zu system
) nie zurückkehrt, das heißt, wenn Sie rufen execv
Ihr Programm durchgeführt wird und die Anwendung, die Sie invoke übernimmt den Prozess.
Andere Tipps
Zusätzlich zu dem, was sepp2k sagte, Sie könnten in mit create_process
suchen möchten (für Unix.file_descr) oder open_process
(für Kanäle). Diese Funktionen machen einen fork / exec und leiten die i / o für den Prozess. So können Sie mit dem Prozess kommunizieren kann, die man nicht mit system
tun können.
Wenn Sie die Ausgabe von cat
in Ihrem Programm lesen möchten, können Sie ein Rohr mit der pipe
Funktion erstellen und dann die zurückgegebenen file_descrs für create_process
verwenden.