C++ 尝试分叉一个进程时,第一个命令起作用,但第二个命令总是给出一个错误

C++ 尝试分叉一个进程时,第一个命令起作用,但第二个命令总是给出一个错误,c++,shell,unix,process,fork,C++,Shell,Unix,Process,Fork,因此,目前我正在创建一个shell接口,它接受用户命令,然后在单独的进程中执行每个命令。我花了一点时间才将输入正确地输入到字符数组中。(必须对其进行解析并划分每个输入,即args[0]=ls,args[1]=l)。我很确定我做得对,但我想这就是我的问题所在。 因此,在解析输入之后,我创建一个子进程,使用execvp系统调用执行参数。在我的父进程中,我有一个条件语句,如果命令的最后一部分有一个符号,它将调用Wait()函数。 所以我面临的问题是,当我执行这段代码时,我能够正确地执行第一个命令,但是

因此,目前我正在创建一个shell接口,它接受用户命令,然后在单独的进程中执行每个命令。我花了一点时间才将输入正确地输入到字符数组中。(必须对其进行解析并划分每个输入,即args[0]=ls,args[1]=l)。我很确定我做得对,但我想这就是我的问题所在。 因此,在解析输入之后,我创建一个子进程,使用execvp系统调用执行参数。在我的父进程中,我有一个条件语句,如果命令的最后一部分有一个符号,它将调用Wait()函数。 所以我面临的问题是,当我执行这段代码时,我能够正确地执行第一个命令,但是无论第二个命令是什么,我都会得到一个错误。我认为这与事后没有清除阵列有关,但很难缩小此问题的范围。任何帮助都将不胜感激

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>

#define MAX_LINE 80 //the maximum length command

using namespace std;

int main()
{
  char* args[MAX_LINE/2 + 1]; //command line arguments
  char str[41]; //intitialize string for input
  int should_run = 1; //flag to determine when to exit program
  int index = 0;
  pid_t pid; //process id

  while (should_run) {
    cout << "prompt> ";
    fflush(stdout);

    cin.getline(str, 41);

    args[index] = strtok(str, " ");

    while (args[index] != NULL) {
      // test      cout << args[index] << endl;
      index++;
      args[index] = strtok(NULL, " ");
    }

    args[index + 1] = NULL;

    if (strcmp (args[0], "exit") == 0) //in input is "exit", exit the while loop
      break;

    // (1) fork a child process using fork()
    pid = fork();

    if (pid < 0) { //error handling
      perror("Fork Failed.");
      break;
    }
    // (2) the child process will invoke execvp()
    if (pid == 0) {
      //child process
      cout << "child:" << pid << endl;
      execvp (args[0], args);
    }

    // (3) if command didn't included &, parent will invoke wait()
    //parent process
    if (pid > 0)
      {
        // parent process
        if (strcmp (args[index], "&") == 0) {
          wait(0);
          cout << "parent: " << pid << endl;
        }
      }
  }
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_LINE 80//最大长度命令
使用名称空间std;
int main()
{
char*args[MAX_-LINE/2+1];//命令行参数
char str[41];//初始化输入字符串
int应该\u run=1;//确定何时退出程序的标志
int指数=0;
pid\u t pid;//进程id
while(应该运行){

在解析第二个和后续命令时,您是否忘记将
索引重新初始化为0。

错误是非常明显的。我确信,一旦您使用调试器一次一行地逐行检查代码,检查所有变量的值,您将能够自己找出错误。知道如何使用调试器是每个C++开发者必备的技能。自由提示:在第二次循环中使用调试器显示 index <代码>的值。@ SamVarshavchik,你有没有机会推荐一个?我还没有学会如何正确地使用一个。现在是一个好的开始时间。在Linux和UNIX上,<代码> GDB < /代码>统治了。请注意,只有一个调试器。@SamVarshavchik我的索引应该在while循环中初始化,嗯?差不多。