我正在写一个基本的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