【问题标题】:program stops after execvp( command.argv[0], command.argv)程序在 execvp(command.argv[0],command.argv) 后停止
【发布时间】:2012-04-25 22:27:57
【问题描述】:

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


}

【问题讨论】:

  • 这正是exec* 函数应该如何工作的!他们加载新程序并用新程序替换您的程序。
  • @Aaron:您会期望飞机飞行员至少阅读他们想要“工作”的飞机的手册。为什么你对程序员没有同样的期望?

标签: c++ operating-system execvp


【解决方案1】:

来自man pageexecvp(3)

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

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

我想用一张图片来说明问题,因为一张图片能说出一千个单词。无意冒犯:) :)

【讨论】:

    【解决方案2】:

    来自exec上的文档

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这可能应该作为对@Pavan 问题的评论,或者是一个完整且正确的答案。
      • 英语是一种你知道的语言 :) 我改写了我的答案。
      • @crashmstr:我认为这家伙低于评论阈值。
      • 确实,这家伙低于评论门槛,只能评论自己的这个答案。
      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多