Вопрос

Я довольно новичок в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top