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

时间:2012-04-13 14:35:59

标签: c++ operating-system execvp

我正在编写一个小型shell程序,它接受命令并执行它。如果用户输入无效命令,则if语句返回-1。如果命令正确则执行命令,但是一旦执行命令,程序就会结束。我做错了什么不会在它之后执行代码行?我用ls和cat命令测试了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;


}

3 个答案:

答案 0 :(得分:6)

来自execvp(3)的{​​{3}}

  

exec()函数系列替换当前的过程映像   一个新的过程图像

因此您的当前过程映像将被命令映像覆盖!因此,您需要始终使用fork+exec组合,以便您的命令在子进程中执行,并且您当前的进程将作为父进程安全地继续!

在较轻松的音符上,我想用图片说明问题,因为图片说千言万语。没有违法行为:):)

enter image description here

答案 1 :(得分:0)

来自exec

上的文档
  

exec()系列函数用新的过程映像替换当前过程映像。本手册页中描述的功能是execve(2)的前端。 (有关更换当前过程映像的更多详细信息,请参阅&gt; execve(2)的手册页。)

如果您希望继续进程,则这不是您要使用的功能。

答案 2 :(得分:0)

@Pavan - 就像我这样的挑剔者,从技术上来说,“当前进程已经消失”的说法并不属实。它仍然是相同的进程,使用相同的pid,只是用不同的图像(代码,数据等)覆盖。