Fork和pipe文件描述符错误
fork and pipe bad file descriptor error
我试图写一个基本的shell,为了方便管道,我写了下面的函数,其中tokens
是要执行的行,index
是tokens
中管道字符的位置(目前,管道需要两边都有空白)。每次我在shell中运行管道命令时,两个命令都按预期运行,但无法写入/读取管道,错误为"错误的文件描述符"。这令人困惑的原因是我的文件重定向工作得很好,所以我不明白为什么它不能与管道一起工作。我读了文档,看了一些示例代码,我想不出我做错了什么。几个小时后,我不知所措,我哪里做错了?
int pipeit(vector<string> tokens,unsigned int index){
//separate the entire line into two delimited by the pipe
vector<string> firstline;
vector<string> secondline;
for(unsigned int i=0;i<tokens.size();i++){
if(i==index){
continue;
}
else if(i<index){
firstline.push_back(tokens[i]);
}
else{
secondline.push_back(tokens[i]);
}
}
//make sure the lines aren't empty
if(secondline.size()==0||firstline.size()==0){
fprintf(stderr, "ERROR, expected at least one command at both ends of pipen");
}
//open a pipe, check that it was successfully created
int pip[2];
if(pipe(pip)<0){
perror("pipe failure");
return -1;
}
//attempt to fork
int parentstatus=0;
int childstatus=0;
switch(fork()){
//fork failed, close the pipe and return -1 (failure)
case -1:
{
close(pip[0]);
close(pip[1]);
perror("fork failure");
return -1;
}
//pid of 0 indicates this is the child process
case 0:
{
//close the write end of the pipe and redirect stdin to the read end
close(pip[0]);
int stdIn=dup(0);
dup2(pip[1],0);
//once redirect is done, can close the other end of the pipe
close(pip[1]);
//parse the second line as a list of commands (not important for question)
//then restore stdin, close the old file descriptor pointing to the pipe
execute_line(secondline,builtins);
dup2(stdIn,0);
close(stdIn);
break;
}
//pid other than 0 indicates this is the parent process
default:
{
//close the read end of the pipe
close(pip[1]);
//redirect stdout to the write end of the pipe
int stdOut=dup(1);
dup2(pip[0],1);
close(pip[0]);
//execute this line (not important for question)
parentstatus=execute_line(firstline,builtins);
//restore stdout and close the temporary fd pointing to the pipe
dup2(stdOut,1);
close(stdOut);
//wait for child process to exit and store it's return value in 'status' (then childstatus)
int status;
wait(&status);
childstatus=status;
break;
}
}
//return a combination of the parent and child's return status
//(not standard, I know, just easy and irrelevant for the question)
return childstatus & parentstatus;
}
tokens
只是一个空格分隔的std::vector<string>
,包含要执行的命令(是的,你需要用空格填充'|'才能工作,不要担心),index
是列表中发现'|'字符的地方,让事情变得更容易。对于可运行的源文件,只需将上述函数定义粘贴到:
#include <unistd.h> //pipe, dup2, fork
#include <iostream>
#include <string>
int builtins = 0xf00; //not what this actually is, but that doesn't matter atm
using namespace std;
int pipeit(vector<string> tokens, unsigned int index);
void execute_line(vector<string> cmds, int biltins){
cout << "Executing: " << endl;
for(unsigned int i = 0; i < cmds.size(); ++i){
cout<<cmds[i]<< " ";
}
cout << endl;
}
int main(){
vector<string> cmds;
cmds.push_back(new string("cmd1"));
cmds.push_back(new string("|"));
cmds.push_back(new string("cmd2"));
return pipeit(cmds, 1);
}
问题是我从管道的写端读取并写入到读端。当您使用pipe(my_pipe)
时,my_pipe[0]
仅为用于读取,my_pipe[1]
仅为用于写入。这并不意味着我的代码可以为无限管道工作,对于其他人来说,但是它现在可以为单管道工作。
CTC: IRC用户C——
相关文章:
- AMQP-CPP >处理程序中的错误文件描述符
- 提升 ASIO 绑定:错误的文件描述符
- 将 Boost Asio 与 ZeroMQ 集成,文件描述符错误?
- VS 链路错误描述中的"@@YAHXZ"是什么意思?
- 如何将Hresult转换为错误描述
- 命名管道,选择错误的文件描述符C++
- 使用c++使用accept()和文件描述符会导致错误加重
- 套接字编程:"接受:错误的文件描述符"
- BGL:邻接列表为描述符返回错误的边缘属性
- 尽管 QSqlQuery::exec 失败,但没有提供错误描述
- 关于在模型/视图Qt文档中排序的描述可能是错误的
- 操作系统全局描述符表编译错误
- 更改描述函数行为的位置是否会导致错误?
- 提升错误代码人类可读的描述
- recv() 失败:错误的文件描述符 c++ Linux
- 消息队列错误的文件描述符错误
- Fork和pipe文件描述符错误
- 如何获得WinRT / Windows 10 Store代码的HRESULT错误代码的描述
- Vera ++抛出错误:无法打开配置文件默认的配置文件描述
- 用GDB中更有意义的错误描述替换SIGABRT