对于普通管道分为四种情况;
1)读端关闭,则写端自动关闭;
2)写端关闭,则读端先读完缓冲区内容再关闭;
3)读端快,写端慢,读端等待写端二者保持同步;
4)读端慢,写端快,将缓冲区写满后停下来;
下面代码是匿名管道代码;
#include<stdio.h>
#include<unistd.h>#include<string.h>
#include<errno.h>
int main()
{
int pipefd[2];
int p=pipe(pipefd);
if(p==-1)
{
printf("mkpipe failure\n");
return 1;
}
pid_t id= fork();
if(id<0)
{
printf("fork error\n");
return 2;
}
else if(id==0)
{//child
int count=0;
char* message="a";
close(pipefd[0]);
while(count<6)
{
write(pipefd[1],message,strlen(message));
printf("%d\n",count++);
sleep(1);
}
// close(pipefd[1]);
}
else
{//father
int status=0;
char buf[10000];
close(pipefd[1]);
int ccount=0;
//close(pipefd[0]);
while(ccount++<5)
{
ssize_t r=read(pipefd[0],buf,sizeof(buf));
if(r<0)
return 3;
else if(r==0)
return 4;
else
buf[r]=0;
printf("hehe::%s\n",buf);
// sleep(100);
}
close(pipefd[0]);
waitpid(id,&status,0);
printf("signal:%d,exit:%d\n",status&0Xff,(status>>8)&0Xff);
}
return 0;
}
下面是命名管道的代码;
//server
int main()
{
mkfifo("./file",S_IFIFO|0666);
int fd=open("./file",O_WRONLY);
umask(0);
char* message="abcd";
write(fd,message,strlen(message));
// printf("%s",message);
return 0;
}
int main()
{
int fd=open("./file",O_RDONLY);
char buf[100];
ssize_t r=read(fd,buf,sizeof(buf)-1);
if(r<0)
return 1;
else if(r==0)
return 2;
else
{
buf[r]=0;
printf("%s\n",buf);
}
return 0;
}
匿名管道和命名管道的区别;
匿名管道是在内核中开辟一段缓冲区,可将其看作文件,用户通过文件描述符对其进行读写操作;只能实现有血缘关系的两个进程之间的通信;
命名管道在创建时要指明文件创建路径以及权限的说明;命名管道可以实现无血缘关系的两个进程之间的通信;