execvp无法运行新程序

时间:2017-02-13 09:46:51

标签: c++ linux

我必须编写一个程序,当用户输入某些命令时,将使用execvp启动一个名为demo.cpp的新程序。用户将以

格式输入输入

bg演示单词int1 int2(忽略单词bg的单词相关性,我将其存储在我的代码中名为command的字符串中)。

这是代码:

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;
 }

每次代码打印&#34;失败&#34;。我唯一能想到的是,传递给execvp的参数格式可能存在错误。此代码和demo.cpp存储在同一文件夹中。

1 个答案:

答案 0 :(得分: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,然后获取char指针。这可以避免任何缓冲区溢出的风险。 (另一方面,const_cast不是很好 - 但我很确定它实际上是安全的。)

其次,您无法传递exec* C ++源文件的名称!你必须构建可执行文件(可能称之为demo),然后执行:

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

(您还需要确保当前目录是包含可执行文件的目录。)