Как правильно использовать команду Unix exec C (++) -? - PullRequest
3 голосов
/ 16 ноября 2009

В частности, мне нужно вызвать версию exec, которая поддерживает текущий рабочий каталог и отправляет стандарт на тот же терминал, что и программа, вызывающая exec. У меня также есть вектор строковых аргументов, которые мне нужно как-то передать, и мне интересно, как бы я все это сделал. Мне сказали, что все это возможно исключительно с fork и exec , и, учитывая ужасное отсутствие документации в Google, я не смог заставить работать exec part.

Какой exec метод я ищу, который может это сделать, и как мне его назвать?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2009

Если у вас есть вектор строк, вам нужно преобразовать его в массив char* и вызвать execvp

#include <cstdio>
#include <string>
#include <vector>

#include <sys/wait.h>
#include <unistd.h>

int main() {
    using namespace std;

    vector<string> args;
    args.push_back("Hello");
    args.push_back("World");

    char **argv = new char*[args.size() + 2];
    argv[0] = "echo";
    argv[args.size() + 1] = NULL;
    for(unsigned int c=0; c<args.size(); c++)
        argv[c+1] = (char*)args[c].c_str();

    switch (fork()) {
    case -1:
        perror("fork");
        return 1;

    case 0:
        execvp(argv[0], argv);
        // execvp only returns on error
        perror("execvp");
        return 1;

    default:
        wait(0);
    }
    return 0;
}
1 голос
/ 16 ноября 2009

Вам не обязательно нужен Google, чтобы это выяснить, у вас должна быть доступна команда man, чтобы вы могли man fork и man exec (или, возможно, man 2 fork и man 3 exec), чтобы узнать, как параметры для этих системных и библиотечных функций должны быть сформированы.

В Debian и Ubuntu эти справочные страницы находятся в пакете manpages-dev, который можно установить с помощью synaptic или с помощью:

sudo apt-get install manpages-dev
1 голос
/ 16 ноября 2009

Возможно, вы ищете execv () или execvp () .

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