семейство exec с файловым вводом - PullRequest
0 голосов
/ 03 октября 2011

Эй, ребята, я пытаюсь написать оболочку на C ++, и у меня возникли проблемы с функцией использования входного файла с командами exec.Например, оболочка bc в Linux может выполнять команду «bc

char* input = “input.txt”;
execlp(input, bc, …..)    // I don’t really know how to call the execlp command and all the doc and search have been kind of cryptic for someone just starting out.

Возможно ли это даже с помощью команд exec?Или мне придется читать построчно и запускать команды exec в цикле for ??

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

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

 const char *input = "input.txt";
 int fd = open(input, O_RDONLY);
 if (fd < 0)
     throw "could not open file";
 if (dup2(fd, 0) != 0)  // Testing that the file descriptor is 0
     throw "could not dup2";
 close(fd);             // You don't want two copies of the file descriptor
 execvp(command[0], &command[0]);
 fprintf(stderr, "failed to execvp %s\n", command[0]);
 exit(1);

Возможно, вы захотите более умную обработку ошибок, чем throw, не в последнюю очередь потому, что это дочерний процесс, и это должен знать родитель.Но throw сайты отмечают точки, где обрабатываются ошибки.

Обратите внимание на close().

1 голос
/ 03 октября 2011

перенаправление выполняется оболочкой - это не аргумент для bc. Вы можете вызвать bash (эквивалент bash -c "bc < text.txt")

Например, вы можете использовать execvp с аргументом файла "bash" и списком аргументов

"bash"
"-c"
"bc < text.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...