一、管道
有名管道
无名管道
区别:有名管道在任意两个进程间通信,无名管道一般在父子进程间通信。
二、使用步骤
1.有名管道
代码如下(示例):
//////////
mkfifo//首先创建管道文件 fifo
//创建a.c,向文件中写入”hello“
int main()
{
int fd=open("./fifo",O_WRONLY)//打开管道文件,只写方式
assert(fd!=-1);
printf("fd=%d\n",fd);
write(fd,"hello",5);//写入数据
close(fd)//关闭文件
}
//创建b.c,从文件读取数据
int main()
{
int fd=open("./fifo",O_RDONLY)//打开管道文件,只读方式
assert(fd!=-1);
printf("fd=%d\n",fd);
char buff[128]={0};
read(fd,buff,127);//读取数据
printf("read:%s\n",buff);//打印
close(fd)//关闭文件
}
执行结果:
2.无名管道
代码如下(示例):
int main()
{
int fd[2];// fd[0]读端 fd[1]写端
assert(pipe(fd)!=-1);//创建无名管道
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)//子进程写入数据
{
close(fd[0])
write(fd[1],"hello",5);
close(fd[1]);
}
else//父进程读取数据
{
close(fd[1])
char buff[128]={0};
read(fd[0],buff,127);
printf("read:%s\n",buff);
close(fd[0]);
}
}
总结
管道不是真实存在的,是内存的一种直观表现形式,向管道中写入数据其实是向内存中写入数据,因此进程间通常采用管道而不采用磁盘文件。
管道通讯是半双工的,通讯时数据流只能是单向的。