在自制的shell c ++中实现多个管道

时间:2015-09-18 16:44:11

标签: c++ linux shell pipe

我只是将代码放在这里执行程序 存在包含成员char* command_list[MAXCOMMANDS][MAXARGUMENTS]

的结构

此成员中每行的第一个位置包含该命令,该行中的其余项是参数

我已经完成了执行过程,在给出输入ls | wc时给出**

  

DUP2 HERE:错误的文件描述符

下面的结构

struct command
{
    ifstream input;
    ofstream output;    

    int num_commands=-1;
    int num_args[MAXCOMMANDS]={0};

    char* command_list[MAXCOMMANDS][MAXARGS];                   //command and their arguments storage
    vector<string> pr_operator;                         //Pipe or redirection operators storage

    bool background_task;
    bool append;

};

执行以下功能

int execute()
{
    pid_t pid,wpid;
    int status; 

    int num_pipes=count_pipes();    

    int pfds[2*num_pipes];

    for(int i=0;i<num_pipes;i++)
    {
        if(pipe(pfds+2*i)<0)
        {
            perror("Cannot Pipe");
            exit(1);
        }
    }

    for(int i=0,j=0;i<=s.num_commands;i++,j+=2)
    {
        pid=fork();

        if(pid==0)
        {
            if(i>0)                                  //if not first command
            {
                if(dup2(pfds[j-2],0)<0)
                    {perror("DUP2 HERE");exit(1);}

                close(pfds[j-2]);
                close(pfds[j-1]);   
            }

            if(i<s.num_commands)         // if not last command
            {
                if(dup2(pfds[j+1],1)<0)
                    {perror("DUP2");exit(1);}
                close(pfds[j+1]);
                close(pfds[j]);
            }


            if(execvp(s.command_list[i][0],s.command_list[i])==-1)
            {
                perror("My Shell");
                exit(1);
            }

        }
        else if(pid<0)
        {
            perror("My Shell");
            exit(1);
        }
        else
        {   
            for(int k=0;k<2*num_pipes;k++)
                close(pfds[k]);

            for(int k=0;k<num_pipes+1;k++)
                wait(&status);

        }

    }

    return 1;

}

0 个答案:

没有答案