第一种情况:关闭管道的读端和写端
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<sys/wait.h>
int main()
{
int fds[2];
int ret=pipe(fds);
if(ret==-1)
{
printf("Create pipe error!errno is :%d\n",errno);
return 1;
}
pid_t id=fork();
if(id<0)
{
printf("fork error!");
return 2;
}
else if(id==0)
{
close(fds[0]);//关闭读端
char* msg="I am child!";
int i=0;
while(i<10)
{
if(i<8)
{
write(fds[1],msg,strlen(msg)+1);
sleep(1);
}
sleep(1);
++i;
}
}
else
{
close(fds[1]);//关闭写端
char buf[1024];
int j=0;
while(j<3)
{
ssize_t ret=read(fds[0],buf,sizeof(buf));
++j;
}
close(fds[0]);
sleep(10);
if(waitpid(id,NULL,0)<0)
{
return 3;
}
}
return 0;
}
第二种情况:管道的写端不关闭,父进程一直等待
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main()
{
int fds[2];
int ret=pipe(fds);
if(ret==-1)
{
printf("Create ppipe error!errno code is:%d\n",errno);
return 1;
}
pid_t id=fork();
if(id<0)
{
printf("fork error!");
return 2;
}
else if(id==0)
{
close(fds[0]);//关闭读端
char *msg="I am child!";
int i=0;
while(i<0)
{
if(i<5)
{
write(fds[1],msg,strlen(msg)+1);
sleep(1);
}
sleep(1);
++i;
}
close(fds[1]);
}
else
{
close(fds[1]);//关闭写端
char buf[1024];
int j=0;
while(j<100)
{
ssize_t ret=read(fds[0],buf,sizeof(buf));
printf("father read :%s,code is %d\n",buf,ret);
++j;
}
if(waitpid(id,NULL,0)<0)
{
return 3;
}
}
return 0;
}
第三种情况:子进程一直写,父进程一直读
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<errno.h>
int main()
{
int fds[2];//定义一个数组,存三个变量
int ret=pipe(fds);//创建管道
if(ret==-1)//如果ret等于-1,说明创建管道失败了,返回错误码
{
printf("Create pipe error!erron code is:%d\n",errno);
return 1;
}
pid_t id=fork();
if(id<0)
{
printf("fork error!");
return 2;
}
else if(id==0)
{
close(fds[0]);//关闭读端
char* msg="I am child!";
int i=0;
while(1)
{
write(fds[1],msg,strlen(msg)+1);
printf("%d\n",i);
++i;
}
}
else
{
close(fds[1]);//关闭写端
char buf[1024];
if(waitpid(id,NULL,0)<0)
{
return 3;
}
}
return 0;
}
第四种情况:匿名管道
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main()
{
int fds[2];
int ret=pipe(fds);
if(ret==-1)
{
printf("Create pipe error! errno code is :%d\n",errno);
return 1;
}
pid_t id=fork();
if(id<0)
{
printf("fork error!");
return 2;
}
else if(id==0)
{
close(fds[0]);
char* msg="I am child!";
while(1)
{
write(fds[1],msg,strlen(msg)+1);
sleep(1);
}
}
else
{
close(fds[1]);
char buf[1024];
while(1)
{
read(fds[0],buf,sizeof(buf));
printf("father read:%s\n",buf);
}
}
return 0;
}