如何解决在 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 举报,一经查实,本站将立刻删除。