Вызов внешней программы изнутри OCaml - PullRequest
6 голосов
/ 04 декабря 2010

Я довольно новичок в OCaml и пытался выяснить, как вызывать внешнюю программу из OCaml.

Я следовал документации здесь и делалследующий вызов:

Unix.execv "cat text_file";;

Это возвращает следующее:

string array -> 'a = <fun>

Как именно я получаю доступ к возвращенной анонимной функции?

cat text_file - это простая попытканапечатайте содержимое файла, команда, которую я на самом деле хочу выполнить, немного сложнее.Тем не менее, я предполагаю, что если я смогу запустить это, я смогу запустить мою настоящую программу.

Ответы [ 2 ]

11 голосов
/ 04 декабря 2010

Первый аргумент execv - это программа, которую вы хотите запустить, а второй - массив, содержащий аргументы. Кроме того, execv требует полного пути к программе; Вы можете использовать execvp для поиска программы в пути выполнения. Кроме того, первым аргументом программы является имя самой программы. Поэтому вы хотите "/bin/cat" в качестве первого аргумента, а не "cat text_file", а [| "cat"; "text_file" |] в качестве второго аргумента (или вызовите execvp и передайте "cat" в качестве первого аргумента).

Однако, чаще всего вы действительно хотите system, а не execv.

Обратите внимание, что system позволяет вам передавать одну строку так, как вы хотите, и что execv (в отличие от system) никогда не возвращается, т. Е. Как только вы вызываете execv, ваша программа завершена, и приложение, которое вы вызываете, вступает во владение процесс.

9 голосов
/ 04 декабря 2010

В дополнение к тому, что сказал sepp2k, вы можете захотеть использовать create_process (для Unix.file_descr) или open_process (для каналов).Эти функции делают fork / exec и перенаправляют ввод / вывод для процесса.Таким образом, вы можете общаться с процессом, чего вы не можете сделать с system.

Если вы хотите прочитать вывод cat в вашей программе, вы можете создать канал, используя pipe, а затем используйте возвращенный file_descrs для create_process.

...