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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top