2017-02-13 5 views
1

Мне нужно написать программу, которая запустит новую программу под названием demo.cpp, используя execvp, когда пользователь вводит определенные команды. Пользователь вводит ввод в форматеexecvp не запускает новую программу

bg demo word int1 int2 (игнорировать слово релевантность слова bg, я храню его в строке, называемой командой в моем коде).

Это код:

int main(){ 

char *argv[5]; 
argv[0] = new char[10]; 
argv[1] = new char[10]; 
argv[2] = new char[10]; 
argv[3] = new char[10]; 
argv[4] = nullptr; 


string command; 
pid_t PID; 

cin>>command; //store the string 'bg' 

cin>>argv[0]>>argv[1]>>argv[2]>>argv[3]; 

PID = fork(); 

if(PID<0){ 
    perror("Fork failed!"); 
} 

else if(PID==0){ 

    if(execvp("./demo.cpp",argv)<0) 
      printf("Failed"); 
    } 

wait(0); 

return 0; 
} 

Каждый раз, когда код печатает "Failed". Единственное, что я могу думать, это, возможно, ошибка в формате аргументов, переданных execvp. Этот код и demo.cpp хранятся в одной папке.

+2

Что такое ' ./demo.cpp'? Это исходный файл на C++? Вы не можете выполнить исходный файл C++. – mch

+0

Поиск похожих проблем на SO, проверьте этот вопрос, например http://stackoverflow.com/questions/14301407/how-does-execvp-run-a-command – Laza

+0

@mch: Я глуп! Конечно, вы не можете выполнить execvp исходный файл C++. –

ответ

2

У вас возникли две проблемы: во-первых, execvp нуждается в том, чтобы список предоставленных аргументов был нулевым. Вам нужно

char *argv[5]; // Not 4. 

    ... // input as before 

    argv[4] = nullptr; 

Кстати, лично я хотел бы изменить это:

std::array<std::string,4> arguments; 
    std::cin>>arguments[0]>>arguments[1]>>arguments[2]>>arguments[3]; 
    char *argv[5]; 
    for (size_t i = 0; i<4; i++) { 
     argv[i] = const_cast<char*>(arguments[i].c_str()); 
    } 
    argv[4] = nullptr; 

Дело в том, чтобы сделать вклад в std::string, а затем получить указатель обугленного впоследствии. Это позволяет избежать риска переполнения буфера. (С другой стороны, const_cast не очень приятный, но я уверен, что это действительно безопасно.)

Во-вторых, вы не можете передать exec* имя исходного файла C++! Вы должны построить исполняемый файл (вероятно, назвав его demo), а затем EXEC, что: (. Кроме того, необходимо убедиться, что текущий каталог является каталог, содержащий исполняемый файл)

if(execvp("./demo",argv)<0) 

+0

Я пробовал первое предложение, и он все еще терпит неудачу, хотя я редактировал код в вопросе, чтобы включить ваше предложение. – Sim

+0

Вы правы, ошибка заключалась в том, что я передавал исходный файл! Почему в учебниках не упоминается эта деталь! – Sim

Смежные вопросы