liunxC下的管道编程!
简单的标准输入输出重定向(<和>):,先dup2然后exec。
管道(|):Shell进程先调用pipe创建一对管道描述符,然后fork出两个子进程,一个子进程关闭读端,调用dup2把写端赋给标准输出,另一个子进程关闭写端,调用dup2把读端赋给标准输入,两个子进程分别调用exec执行程序,而Shell进程把管道的两端都关闭,调用wait等待两个子进程终止。
你的程序应该可以处理以下命令:
○ls△-l△-R○>○file1○
○cat○<○file1○|○wc△-c○>○file1○
注:○表示零个或多个空格,△表示一个或多个空格
如何改进呢!
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80
int main(void)
{
int n;
int fd[2];
pid_t pid1,pid2;
//char *argv_execv[]={"ls", "ls", NULL};
if (pipe(fd) < 0)
{
perror("pipe"); exit(1);
}
if ((pid1 = fork()) < 0)
{
perror("fork"); exit(1);
}
if (pid1 == 0)
{
close(fd[0]);
dup2(fd[1],STDOUT_FILENO);
//execv("/bin/ls",argv_execv);
}
if ((pid2 = fork()) < 0)
{
perror("fork"); exit(1);
}
if (pid1 == 0)
{
close(fd[1]);
dup2(fd[0],STDIN_FILENO);
}
else
{
close(fd[0]);
close(fd[1]);
wait(NULL);
return 0;
}
}
[解决办法]
问题应该分下面几步:
1、参数解析,分析出来里面各个命令及对应的输入输出数据,是文件还是通过管道传输
解析的结果放到数组或者链表中
这个是基础,一定要正确
2、对于输入重定向的类型,从文件中读入数据再传递给处理程序即可
3、对于输出重定向的类型,获取到结果后写入指定的文件即可
4、对于管道类型的,从前一个命令获取输出,传递给后一个命令作为输入即可
2、3、4可以放在一个循环中,处理所有从1中解析出来命令,