Appeler un programme externe de l'intérieur OCaml
Question
Je suis assez nouveau pour OCaml et essayait de comprendre comment appeler un programme externe depuis OCaml.
J'ai suivi la documentation et faire l'appel suivant:
Unix.execv "cat text_file";;
renvoie les éléments suivants:
string array -> 'a = <fun>
Comment puis-je exactement accéder à la fonction anonyme de retour?
cat text_file
est une tentative simple d'imprimer le contenu du fichier, la commande que je veux vraiment courir est un peu plus complexe. Cependant, je suppose que si je peux obtenir cette course, je devrais être en mesure d'obtenir mon fonctionnement réel du programme.
La solution
Le premier argument de execv
est le programme que vous souhaitez exécuter et le second est un tableau contenant les arguments. , execv
exige également le chemin complet du programme; vous pouvez utiliser execvp
pour rechercher le programme dans le chemin d'exécution. En outre, le premier argument au programme est le nom du programme lui-même.
Donc, vous voulez "/bin/cat"
comme premier argument, non "cat text_file"
et [| "cat"; "text_file" |]
comme second argument (ou execvp
d'appel et passer "cat"
comme premier argument).
Cependant, plus souvent qu'autrement, vous voulez vraiment system
, pas execv
.
Notez que system
vous permet de passer une seule chaîne comme vous voulez et que execv
(contrairement system
) ne retourne jamais, à savoir une fois que vous appelez execv
votre programme est fait et l'application que vous invoquez prend en charge le processus.
Autres conseils
En plus de ce que dit sepp2k, vous voudrez peut-être regarder dans create_process
(pour Unix.file_descr) ou open_process
(pour les canaux). Ces fonctions font une fourchette / exec et réexpédie le i / o du processus. De cette façon, vous pouvez communiquer avec le processus, que vous ne pouvez pas faire avec system
.
Si vous voulez lire la sortie de cat
dans votre programme, vous pouvez créer un tuyau à l'aide de la fonction pipe
, puis utilisez les file_descrs retournés pour create_process
.