简单说明
管道只能在父进程和子进程之间使用,且 fd[2],只能f0 read,f1 write,面向字节流
测试代码
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main()
{
int fd[2];
//f0 read f1 write
int nret=pipe(fd);
if(nret !=0)
{
printf("pipe error\n");
return -1;
}
nret=fork();
if(nret==0)
{
printf("I am is child,start\n");
close(fd[1]);
char*buf[32];
int error_index=0;
int index=0;
while(1)
{
memset(buf,0,32);
int size=read(fd[0],buf,32);
printf("index:%d,recv: %s\n",index++,buf);
if(size<=0)
{
error_index++;
}else
{
error_index=0;
}
if(error_index==10)break;
}
close(fd[0]);
printf("I am is child,end\n");
}else if(nret>0)
{
close(fd[0]);
printf("I am is father,start\n");
for(int i=0;i<10;i++)
{
char*tmp_str="I am is child";
write(fd[1],tmp_str,strlen(tmp_str));
sleep(2);
}
close(fd[1]);
printf("I am is father,end\n");
}else
{
printf("fork error\n");
return -1;
}
return 0;
}
测试结果
I am is father,start
I am is child,start
index:0,recv: I am is child
index:1,recv: I am is child
index:2,recv: I am is child
index:3,recv: I am is child
index:4,recv: I am is child
index:5,recv: I am is child
index:6,recv: I am is child
index:7,recv: I am is child
index:8,recv: I am is child
index:9,recv: I am is child
I am is father,end
index:10,recv:
index:11,recv:
index:12,recv:
index:13,recv:
index:14,recv:
index:15,recv:
index:16,recv:
index:17,recv:
index:18,recv:
index:19,recv:
I am is child,end
按 <RETURN> 来关闭窗口...