在shell

时间:2016-04-06 19:00:00

标签: c linux shell process pipeline

我正在写一个基本的shell 现在它可以执行单进程命令,处理输入和输出重定向并在后台执行命令 问题是,当我尝试使用管道时,它可以正确执行命令,但之后shell停止输入提示并停止接收命令。

如:cat a.txt | grep abc

结果:
$ ABC
(空行并停止反应)

无论我在shell中输入什么都不会对它做出反应 我想std_input重定向有问题,或者有一个进程没有结束。

这是启动命令的代码。

void lsh_launch(char **args)
{
int pid=fork();
if (pid== 0)  //children
{
    if(pipe_bool==0)
    {

        if(redir_in_bool==1 && redir_out_bool==1) //redirect input and output
        {
            close(STD_INPUT); 
            int re_input=open(redir_in_adr,O_RDONLY); //open file
            dup(re_input); //redirect std input
            close(STD_OUTPUT);
            int re_output=open(redir_out_adr,O_WRONLY | O_TRUNC | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
            dup(re_output);//redirect std output
            execvp(args[0],args);

        }
        else if(redir_in_bool==1 && redir_out_bool==0) //redirect input
        {
            close(STD_INPUT);
            int re_input=open(redir_in_adr,O_RDONLY);
            dup(re_input);
            execvp(args[0],args);
        }
        else if(redir_out_bool==1 && redir_in_bool==0) //redirect output
        {
            close(STD_OUTPUT);
            int re_output=open(redir_out_adr,O_WRONLY | O_TRUNC | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
            dup(re_output);
            execvp(args[0],args);
        }
        else   //normal command
        {
            execvp(args[0],args);
        }
    }
    else  //pipeline
    {
        char* line2 = lsh_read_line();
        char** args2 = lsh_split_line(line2);
        pipeCommand(args,args2);
        free(line2);
        free(args2);
    }

} 
else  //parent
{
        if(background_bool!=1 )
        {
            waitpid(pid, NULL, 0); 
        }
}
return ;
}

管道代码:

#define STD_INPUT  0
#define STD_OUTPUT 1
void pipeCommand(char **parameter1,char **parameter2)
{
int pipefd[2];
pipe(pipefd);

if(fork())                      //parent process execute second command 
{
    close(pipefd[1]);
    dup2(pipefd[0],STDIN_FILENO);
    close(pipefd[0]);
    execvp(parameter2[0],parameter2);
}
else                            //child process execute first command
{
    close(pipefd[0]);
    dup2(pipefd[1],STDOUT_FILENO);
    close(pipefd[1]);
    execvp(parameter1[0],parameter1);
}
}

另一个代码 http://ideone.com/XEuBVA

0 个答案:

没有答案