1

我正在编写一个小 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;


}
4

3 回答 3

6

从手册execvp(3)

exec() 系列函数用新的进程映像替换当前进程映像

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

在一个轻松的音符上,我想用一张图片来说明这个问题,因为一张图片能说出一千个单词。无意冒犯:) :)

在此处输入图像描述

于 2012-04-13T14:39:18.623 回答
0

从关于exec的文档

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

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

于 2012-04-13T14:39:57.640 回答
0

@Pavan - 仅对于像我这样的挑剔者,从技术上讲,“当前流程已经消失”的说法是不正确的。它仍然是相同的过程,具有相同的 pid,只是被不同的图像(代码、数据等)覆盖。

于 2012-04-13T15:25:48.000 回答