unix pipe() 和dup2()的使用方法和原理

来源:百度知道 编辑:UC知道 时间:2024/07/02 08:15:49
在父子进程通信以及redirection中,经常用pipe(),close()以及dup2()函数来实现。向各位请教,两者的使用方法和原理。谢谢大家。
...可以更清楚地解释一下原理么?

pipe(),父子进程之间通讯工具。pipe有读写两端,用int表示。0-read, 1-write.一端进程将数据写入write内,另一进程由read段读出。使用参数为一个int数组,共两个元素,用以表示读写两端的状态。
close(),用于关闭清空pipe某端,参数为表示pipe端口数组二元素之一。
dup2(),用于redirection, 将pipe某端与标准i/o相连,即将standout information 写入或者pipe内容被standin独出。如dup2(data[1], STDOUT_FINENO).是进程与外界相连的一个工具。

1. 编写程序w.c随机产生1000个的整数,把他们写到屏幕上,每行一个。
2. 编写程序r.c从键盘读入整数计算它们的平均数,遇到文件结束符^D终止。
3. 合并程序w.c和r.c为wr.c用fork产生两个进程,子进程为完成w.c的工作,父进程完成r.c的工作,使得父进程产生的整数通过pipe传递到子进程。
五、实验报告要求
给出wr.c的程序源代码。

六、参考实例
wr.c:

#include <stdio.h>

main(){

int i,pid,r,x,count,p[2];

long int sum;

if(pipe(p)==-1){printf("pipeerr\n");exit(1);}

if((pid=fork())==-1){printf("forkerr\n");exit(1);}

if(pid==0){

close(p[0]);

dup2(p[1],1);

srand(getpid());

for(i=0;i<1000;i++)printf("%d\n",rand());
<