0

有人可以建议这个程序有什么问题吗?我正在尝试通过在这里创建一个子进程来实现类似 shell 的功能。在给出具有单个单词 like lsorpwd它的命令时,但具有多个单词 like ls -lrtorwho am i的命令不起作用。我正在做一些愚蠢的错误,但无法调试。

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <iostream>
    #include <wait.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <cstdlib>
    #define BUFSIZE  200
    #define ARGVSIZE 40
    #define DELIM    "\n\t\r"

    int main ()
    {
      int i,n;
      char buf[BUFSIZE + 1] ;
      char * str = "Shell > ";
      char * clargs[ARGVSIZE] ;
      int returnstatus;
      for(;;)
      {
          n = 1;
          write(STDOUT_FILENO,str,strlen(str));

          read(STDIN_FILENO,buf,BUFSIZE);
          if(!strcmp(buf,"exit\n"))
          {
              perror("exit");
              exit(20);
          }

          clargs[0] = strtok(buf,DELIM);

          while((clargs[n] = strtok(NULL,DELIM)) != NULL)
              n++;

          clargs[n] = NULL;

          switch(fork())
          {
          case 0:
          if((execvp(clargs[0],&clargs[0])) < 0)
              exit(200);

          default:
          wait(&returnstatus);
          printf("Exit status of command : %d\n",WEXITSTATUS(returnstatus));
          for(int i =0; i <= n;i++)
              clargs[i] = "\0";

          for(int i =0; i < BUFSIZE+1;i++)
              buf[i] = '\0';
      }
  }

  return 0;

}

4

1 回答 1

4

您在 中没有空间DELIM
尝试运行时ls -lrt,您希望ls使用两个参数运行可执行文件 -ls-lrt.
但你strtok不会ls -lrt一分为二。因此,您实际上是在尝试运行一个名为 的程序ls -lrt,而没有这样的程序。

添加一个空格DELIM应该可以解决它。

并不是说它在某些情况下不够好。例如,在运行时echo "a b",您想"a b"成为一个参数,因为括号。strtok会把它分成两部分。真正的外壳会进行更复杂的解析。

于 2012-05-25T19:27:52.940 回答