Позвоните внешнюю программу из в ocaml
Вопрос
Я довольно новичок в Ocaml и пытался выяснить, как вызвать внешнюю программу изнутри ocaml.
Я следил за документацией здесь, и сделав следующий звонок:
Unix.execv "cat text_file";;
Это возвращает следующее:
string array -> 'a = <fun>
Как именно я могу получить доступ к возвращенной анонимной функции?
cat text_file
Простая попытка распечатать содержимое файла, команда, которую я на самом деле хочу запустить, это немного сложнее. Тем не менее, я предполагаю, что если я смогу получить этот бег, я должен быть в состоянии получить свою реальную программу.
Решение
Первый аргумент для execv
Является ли программа, которую вы хотите запустить, и вторая - это массив, содержащий аргументы. Также, execv
требует полного пути к программе; вы можете использовать execvp
Чтобы посмотреть программу в пути выполнения. Кроме того, первый аргумент к программе является название самой программы. Так что вы хотите "/bin/cat"
Как первый аргумент, не "cat text_file"
, а также [| "cat"; "text_file" |]
как второй аргумент (или вызов execvp
и пройти "cat"
как первый аргумент).
Однако чаще, чем ты на самом деле хочешь system
, нет execv
.
Обратите внимание, что system
позволяет вам пройти одну строку, как вы хотите, и что execv
(В отличие от system
) Никогда не возвращается, то есть как только вы позвоните execv
Ваша программа выполнена, и приложение, которое вы вызываете, берет на себя процесс.
Другие советы
В дополнение к тому, что сказал SEPP2K, вы можете посмотреть на использование create_process
(для Unix.file_descr) или open_process
(для каналов). Эти функции выполняют FORK / EXEC и перенаправить ввод / вывод для процесса. Таким образом, вы можете общаться с процессом, с которым вы не можете сделать system
.
Если вы хотите прочитать вывод cat
В вашей программе вы можете создать трубу, используя pipe
Функция, а затем используйте возвращенные файл_descrs для create_process
.