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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top