微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 execvp 后提供连续输出的管道

如何解决在 execvp 后提供连续输出的管道

我目前正在做一个项目,我必须在其中创建一个 unix shell。我在执行诸如“ls”或“wc”之类的命令时遇到了我的函数问题。我的代码执行 execvp 并将其正确传输到输出,但在那之后,它不断输入一个空输入,我可以停止它的唯一方法是手动退出程序。我认为这与我没有以正确的顺序关闭管道有关,所以我以各种顺序关闭了它们,但无论我做什么,我仍然遇到同样的问题。

函数执行命令

void singleCommand(vector<string> vcommands) {
  // turn commands into char
  char* command[vcommands.size()+1];
  for(int i=0; i<vcommands.size(); i++){
     command[i] = (char*)vcommands.at(i).c_str();
  }
  command[vcommands.size()] = NULL;

  int p[2];
  pipe(p);

  int pid = fork();
  if(pid == -1){ // verifying fork was created
    printf("Error: fork was unsuccessful,Terminating");
    exit (EXIT_FAILURE);
  }

  if(pid == 0){ //pid returns a zero when a new child process is created.
    close(p[0]);
    dup2(p[1],1);
    close(p[1]);
    execvp (command[0],command);
    exit(1);
  } else if (pid > 0) {//pid is greater than zero we are in the parent
    wait(0);
    close(p[1]);
    dup2(p[0],0); // get stdin from pipe
    close(p[0]);
    char buff[1000]={0};

    read(STDIN_FILENO,buff,250);
    printf("%s",buff);
  }
}

解决方法

我认为这与我没有以正确的顺序关闭管道有关,所以我以各种顺序关闭它们,但无论我做什么,我仍然遇到同样的问题

一个明显的问题是,在父进程中,您关闭管道的写端,读取另一端,只有在调用wait()之后。这个调用有什么作用?它等待孩子完成。

你真的想在孩子死后才读管子吗?这不是 shell 的工作方式,这可能只会给你带来问题,因为管道的容量不是无限的:如果它已满,写入者(子)将阻塞,直到它可以再次写入管道,这永远不会发生因为唯一的读者在等待孩子的结局。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。