首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

liunxC下的管道编程!解决思路

2012-05-24 
liunxC下的管道编程!简单的标准输入输出重定向(和):,先dup2然后exec。管道(|):Shell进程先调用pipe创建一

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中解析出来命令,

热点排行
Bad Request.