UNIX запустить программу в другой программе - PullRequest
3 голосов
/ 23 сентября 2011

Я пытаюсь выполнить программу из C-программы (внутри UNIX).

Мне дали исполняемый файл (программа требует ввода строки во время выполнения и записывает этот ввод в другой файл с именем sample) с именем exec, и я хочу выполнить его в program.c, но передать ввод строки через косвенное обращение.

Для этого я создал файл следующим образом:

% vim input

Я написал следующее во входном файле

content

Сейчас в программе.c,

#include<unistd.h>
int main()
{
      const char* command = "./exec < input";
      execvp(command, NULL);
      return 0;
}

Когда я запускаю программу, содержимое не вводится в файл примера.

Но когда я запускаю его без косвенного обращения, т.е.

const char* command = "./exec";

, затем он работает, и введенные данные сохраняются в файле примера.

Может кто-нибудь сказать, что я делаю неправильно в синтаксисе косвенного обращения.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Синтаксис, который вы используете, должен интерпретироваться такой оболочкой, как bash, csh, ksh и т. Д.

Системный вызов execvp ожидает только путь к исполняемому файлу и количество аргументов,оболочка там не вызывается.

Чтобы выполнить перенаправление таким образом, вам придется использовать системный вызов dup2(2) перед вызовом execvp:

int fd = open("input", O_RDONLY);
/* redirect standard input to the opened file */
dup2(fd, 0);
execvp("/path/to/exec", ...);

Конечно,вам потребуется дополнительная проверка ошибок в реальной программе.

1 голос
/ 23 сентября 2011

Вы не можете сделать перенаправление таким образом с execvp. Используйте system() или начните дружить с dup() и друзьями. Вы можете использовать Google для «перенаправления». Вероятно, вы найдете множество примеров того, как оболочки (например) решают эту проблему.

0 голосов
/ 23 сентября 2011

Семейство функций exec(3) ничего не знает о перенаправлении ввода или разборе командных строк: оно пытается выполнить именно тот исполняемый файл, который вы ему даете. Он пытается найти исполняемый файл с именем "./exec < input", который неудивительно, что не существует.

Одним из решений было бы использование функции system(3) вместо exec. system вызывает пользовательскую оболочку (например, /bin/bash), которая способна анализировать командную строку и выполнять соответствующие перенаправления. Но system() не так универсален, как exec, поэтому может подходить или не подходить для ваших нужд.

Лучшее решение - сделать перенаправление ввода самостоятельно. Что вам нужно сделать, мы используем open(3), чтобы открыть файл и dup2(3), чтобы скопировать дескриптор файла на дескриптор файла 0 (стандартный ввод), а затем exec исполняемый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...