2010-12-03 17 views
6

Ich bin ziemlich neu in OCaml und versuchte herauszufinden, wie man ein externes Programm innerhalb von OCaml aufrufen.Rufen Sie ein externes Programm in OCaml

Ich verfolge die Dokumentation here und machen den folgenden Aufruf:

Unix.execv "cat text_file";; 

Dies gibt die folgende:

string array -> 'a = <fun> 

Wie genau greife ich auf die anonyme Funktion zurückgegeben?

cat text_file ist ein einfacher Versuch, den Inhalt der Datei zu drucken, der Befehl, den ich eigentlich ausführen möchte, ist ein bisschen komplexer. Ich gehe jedoch davon aus, dass ich in der Lage sein werde, mein richtiges Programm zum Laufen zu bringen, wenn ich das in Gang setzen kann.

Antwort

10

Das erste Argument zu execv ist das Programm, das Sie ausführen möchten, und das zweite Argument ist ein Array mit den Argumenten. Außerdem erfordert execv den vollständigen Pfad zum Programm. Sie können execvp verwenden, um das Programm im Ausführungspfad nachzuschlagen. Außerdem ist das erste Argument des Programms der Name des Programms selbst. So wollen Sie "/bin/cat" als erstes Argument, nicht "cat text_file", und [| "cat"; "text_file" |] als zweites Argument (oder execvp aufrufen und "cat" als erstes Argument übergeben).

Aber oft wollen Sie eigentlich system, 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 execv Ihr Programm aufrufen erfolgt und die Anwendung, die Sie übernimmt den Prozess aufrufen.

8

Zusätzlich zu dem, was Sepp2k gesagt hat, möchten Sie vielleicht mit create_process (für Unix.file_descr) oder open_process (für Kanäle) suchen. Diese Funktionen führen fork/exec aus und leiten die E/A für den Prozess um. Auf diese Weise können Sie mit dem Prozess kommunizieren, den Sie mit system nicht ausführen können.

Wenn Sie die Ausgabe von cat in Ihrem Programm lesen möchten, können Sie ein Rohr erstellen mit der pipe Funktion, und verwenden Sie dann die zurückgegebenen file_descrs für create_process.

Verwandte Themen