execvp后程序停止(command.argv [0],command.argv)(program

2019-07-28 23:11发布

我写一个小的shell程序,需要一个命令并执行它。 如果用户输入一个无效命令if语句返回-1。 如果命令是正确的就执行命令,但是一旦执行程序结束命令。 我在做什么错也就是将它不执行的代码行? 我曾与LS测试execvp(command.argv [0],command.argv)和猫命令,所以我敢肯定它的工作原理。 这里是我的代码。

  int shell(char *cmd_str ){
  int commandLength=0;
  cmd_t command;
  commandLength=make_cmd(cmd_str,  command);
  cout<< commandLength<<endl;
  cout << command.argv[0]<< endl;
  if( execvp( command.argv[0], command.argv)==-1)
//if the command it executed nothing runs after this line
  {
    commandLength=-1;

}else
{
  cout<<"work"<<endl;
}

  cout<< commandLength<<endl;
   return commandLength;


}

Answer 1:

从手册页的execvp(3)

在EXEC()函数系列有一个新的进程图像替换当前的进程图像

所以你当前的进程映像被覆盖在命令中的形象! 因此,你需要使用一个fork+exec让你的命令,在子进程来执行,你的当前进程安全继续作为父母总是组合!

开句玩笑我想说明用图片的问题,因为图片讲千言万语 。 没有进攻意图:) :)



Answer 2:

从上的文档EXEC

在执行exec()函数系列用一个新的进程映像替换当前的进程映像。 在这个手册页中描述的功能是用于execve的(2)的前端。 (见手册页>的execve(2)关于更换当前进程图像的进一步的细节。)

如果你希望你的进程继续下去,这是不是你想要使用的功能。



Answer 3:

@Pavan - 只为挑剔采摘像我这样的,技术上的声明“当前进程走了”是不正确的。 它仍然是相同的过程,具有相同PID,仅覆盖了具有不同的图像(代码,数据等)。



文章来源: program stops after execvp( command.argv[0], command.argv)