- 管道:管道是⼀一种最基本的IPC机制,由pipe函数创建;
调⽤用pipe函数时在内核中开辟⼀一块缓冲区(称为管道)⽤用于通信,它有⼀一个读端⼀一个写端,然后通过filedes参数传出给⽤用户程序两个⽂文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。
#include <unistd.h>
int pipe(int filedes[2]);
模拟实现一个单向管道:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd[2] = {0,0};
if(pipe(fd) < 0)
{
perror("pipe");
return 1;
}
pid_t id = fork();
if(id == 0)
{
char msg[] = "pipe666";
while(1)
{
write(fd[1],msg,sizeof(msg));
sleep(1);
}
close(fd[0]);
}else{
//father -> read
char buff[1024] = {0};
while(1)
{
read(fd[0],buf,sizeof(buff));
printf("%s\n",buff);
}
close(fd[1]);
}
return 0;
}
管道的五个特点:
- 智能进行单向通信;
- 智能用于有血缘关系的访问,常用于父子;
- 生命周期随进程;
- 通过流的方式进行访问;
- 以互斥为前提条件,拥有同步机制。
管道会产生的四种情况:
1.读端不读不关闭相应文件描述符表,写端写满会等待;
2.写端不写不关闭相应文件描述符表,读端会等待;
3.读端不读且关闭相应文件描述符表,写端会被操作系统终止;
4.写端不写且关闭相应文件描述符表,读端读完会关闭;
匿名管道与命名管道区别
匿名管道由pipe函数创建并打开。
命名管道由mkfifo函数创建,打开用open
FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一量这些工作完成之后,它们具有相同的语义。