庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

重定向和管道的实现

Posted on 2008-02-29 11:16 dennis 阅读(917) 评论(0)  编辑  收藏 所属分类: linux & C
重定向标准输入的实现:
1)close-then-open: close(0) ; fd=open("test",O_RDONLY); fd将是stdin。
2)open-close-dup-close:
fd=open(file),打开stdin将要重定向的文件;close(0);new_fd=dup(file);close(fd);new_fd就是被重定向的stdin
3)open-dup2-close:
fd=open(file);new_fd=dup2(fd,0);close(fd);

重定向标准输出的实现:
  父进程fork();子进程close(1);create("g",0644),此时子进程的stdout被重定向到g;接下来子进程exec某个程序,文件描述符属于进程属性,exec调用不会改变他们,那么运行的程序的标准输出将被送到g,由此实现了标准输出重定向。

本质上重定向的实现是依赖两个原则:
1、标准输入、标准输出和标准错误分别是0、1和2
2、最低可用描述符:打开文件时,为此文件安排的描述符总是进程内打开文件数组的最低可用位置的索引。

管道:
  匿名管道:适合于有亲缘关系的进程,通过pipe函数实现。
  有名管道:通过mkfifo函数实现,实现进程间的双向通讯可以采用两个有名管道实现,也可以采用socketpair调用。

只有注册用户登录后才能发表评论。


网站导航: