2010-12-03 18 views
6

Soy bastante nuevo en OCaml y estaba tratando de averiguar cómo llamar a un programa externo desde OCaml.Llamar a un programa externo desde OCaml

He estado siguiendo la documentación here, y hacer la siguiente llamada:

Unix.execv "cat text_file";; 

Esto devuelve lo siguiente:

string array -> 'a = <fun> 

¿Cómo funciona exactamente accedo a la función anónima vuelto?

cat text_file es un simple intento de imprimir el contenido del archivo, el comando que realmente quiero ejecutar es un poco más complejo. Sin embargo, supongo que si puedo ejecutar esto, debería poder ejecutar mi programa real.

Respuesta

10

El primer argumento para execv es el programa que desea ejecutar y el segundo es una matriz que contiene los argumentos. Además, execv requiere la ruta completa al programa; puede usar execvp para buscar el programa en la ruta de ejecución. Además, el primer argumento para el programa es el nombre del programa en sí. Así que desea "/bin/cat" como primer argumento, no "cat text_file", y [| "cat"; "text_file" |] como el segundo argumento (o llame al execvp y pase "cat" como primer argumento).

Sin embargo, la mayoría de las veces usted realmente quiere system, no execv.

Tenga en cuenta que system permite pasar una sola cadena como usted quiere y que execv (a diferencia de system) nunca vuelve, es decir, una vez que se llama a execv su programa está hecho y la aplicación que invoca se hace cargo del proceso.

8

Además de lo que dijo sepp2k, es posible que desee examinar el uso de create_process (para Unix.file_descr) o open_process (para canales). Estas funciones hacen un fork/exec y redirigen la E/S para el proceso. De esta forma puede comunicarse con el proceso, lo que no puede hacer con system.

Si desea leer la salida de cat en su programa, puede crear una tubería usando la función pipe, y luego usar los file_descrs devueltos por create_process.

Cuestiones relacionadas