Chiamare un programma esterno da dentro OCaml
Domanda
Sono abbastanza nuovo per OCaml e stava cercando di capire come chiamare un programma esterno da dentro OCaml.
Ho seguito la documentazione qui , e rendendo la seguente chiamata:
Unix.execv "cat text_file";;
Ciò restituisce il seguente:
string array -> 'a = <fun>
Come faccio esattamente accedere alla funzione anonima restituita?
cat text_file
è un tentativo semplice per stampare il contenuto del file, il comando in realtà ho voglia di correre è un po 'più complessa. Tuttavia, presumo che se posso ottenere questo correre, dovrei essere in grado di ottenere la mia vera esecuzione del programma.
Soluzione
Il primo argomento di execv
è il programma che si desidera eseguire e il secondo è un array contenente gli argomenti. Inoltre, execv
richiede il percorso completo del programma; è possibile utilizzare execvp
per cercare il programma nel percorso di esecuzione. Inoltre, il primo argomento del programma è il nome del programma stesso.
Così si vuole "/bin/cat"
come primo argomento, non "cat text_file"
, e [| "cat"; "text_file" |]
come secondo argomento (o chiamata execvp
e passare "cat"
come primo argomento).
Tuttavia, più spesso di quanto non si vuole realmente system
, non execv
.
Si noti che system
consente di passare una singola stringa come si desidera e che execv
(a differenza system
) non ritorna mai, vale a dire una volta che si chiama execv
il programma è fatto e l'applicazione si richiama subentra il processo.
Altri suggerimenti
In aggiunta a quanto detto sepp2k, si potrebbe desiderare di considerare di usare create_process
(per Unix.file_descr) o open_process
(per i canali). Queste funzioni fanno un fork / exec e reindirizzare i / o per il processo. In questo modo è possibile comunicare con il processo, che non si può fare con system
.
Se volete leggere l'output di cat
nel programma, è possibile creare un tubo con la funzione pipe
, e quindi utilizzare le file_descrs restituiti per create_process
.