C ++自定义Shell:Stdin重定向方法分段错误

时间:2015-12-08 17:40:48

标签: c++ shell segmentation-fault io-redirection execvp

我目前正在用C ++创建自己的简单shell来实现管道,< ,>和>>不使用系统重定向。

我的所有实现都有效,但只有一个。我的标准输入重定向实现遇到了分段错误。示例:cat < file.txt

我的shell代码在另一个方法中解析提示输入(argv / argc)并调用IO重定向方法。每个重定向功能都有自己的方法。

我的stdin IO重定向方法将double char指针命令和double char指针文件作为参数。

void redirect(char** cmd, char** file) {
  //declare variables   
  int fd; 
  char c;   
  pid_t pid; 

  fd = open(file[0], O_RDWR | O_CREAT, 0666);

  //opens if no error
  if (fd < 0) {
      printf("Error: %s\n", strerror(errno));
      exit(1);
  }

  dup2(fd, 0); 

  execvp(cmd[0], cmd);
  perror(cmd[0]);       /* execvp failed */
  exit(1);
}

我的shell程序编译并成功运行。但是,当我输入:

cat < file.txt

分段错误(核心转储)

我的其他重定向IO实现具有相同的参数传递和工作,所以我认为我的stdin&#34;&lt;&#34;方法执行不正确。

作品

  1. cat&gt; file.txt的
  2. cat&gt;&gt; file.txt的
  3. cat f.txt&gt; file.txt的
  4. cat f.txt&gt;&gt; file.txt的
  5. 管道(|)方法正常工作
  6. 我真的很感激任何澄清。在研究dup2execvp论坛后,我有点困惑。请告诉我我的方法实现是否有问题。

    主要方法

    373 //main method                                                                                                                                                                  
    374 int main() {
    375   char *argv[ARGSMAX], *p1[ARGSMAX], *p2[ARGSMAX];
    376   Pipeline pipe_redirect;
    377   int argc;
    378   //gets present working directory                                                                                                                                             
    379   char *name = NULL;
    380   size_t size = 0;
    381   name = getcwd(name,size);
    382   // prompt until user quits                                                                                                                                                   
    383   while (true) {
    384     cout << "1730sh:" << name << "$ ";
    385 
    386     //read user input                                                                                                                                                          
    387     argc = readInput(argv);
    388 
    389     //parse input                                                                                                                                                              
    390     pipe_redirect = parse(argc, argv, p1, p2);
    391     if (pipe_redirect == PIPE)
    392       pipeD(p1, p2);
    393     else if (pipe_redirect == APPEND)
    394       append(p1, p2);
    395     else if (pipe_redirect == TRUNCATE)
    396       redirect(p1,p2);
    397     else if(pipe_redirect == TRUNCOUT)
    398       truncOut(p1,p2);
    399     else if(pipe_redirect == ETRUNCATE)
    400       eTruncate(p1,p2);
    401     else if(pipe_redirect == EAPPEND)
    402       eAppend(p1,p2);
    403     else
    404       runP(argc, argv);
    405 
    406     // set argv to null                                                                                                                                                        
    407     for (int i=0; i<argc; i++)
    408       argv[i] = NULL;
    409   }
    410   return 0;
    411 }
    

0 个答案:

没有答案