无名管道
无名管道
只能用于亲缘关系的进程间通信(父子进程,兄弟进程)
管道通信是单工的,一端读,一端写(程序实现设计好)
数据自己读不能自己写
管道可以用于大于2个进程共享
无名管道的读写特性:
父子进程均有pfd[0]=3,pfd[1]=4;(前三个为标准输入输出,错误)
close(pfd[0]);close(pfd[1])
读管道:
管道中有数据,read返回实际读到的字节数
无名管道创建:
- 头文件:#include <unistd.h>
- int pipe(int pfd[2]);
- 成功:0;失败:-1,设置errno
- pfd包含两个整形数组,用来保存文件描述符
- pfd[0]用于读管道;pfd[1]用于写管道
有名管道
-
有名管道:
- 有名管道可以使非亲缘的两个进程互相通信
- 通过路径名来操作,在文件系统中可见,但内容存放在内存中
- 文件IO来操作有名管道
- 遵循先进先出规则
- 不支持leek操作
- 单工读写
-
有名管道其实是一个文件,这个文件只能用于两个进程间通信的桥梁,不存储任何数据内容
-
有名管道的创建
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define N 64int main()
{
int fd;
int n;
char buf[N];
if (mkfifo("pipe", 0666) == -1) //判断管道文件是否存在
{
if (errno != EEXIST) //如果文件存在,则什么也不执行,如果是其他错误,则退出
{
perror("mkfifo");
return -1;
}
}
if ((fd = open("pipe", O_WRONLY)) == -1) //以只写方式打开管道文件,默认追加到文件后面(队列)
{
perror("open pipe");
return -1;
}
while (fgets(buf, N, stdin) != NULL)
{
n = strlen(buf);
if (write(fd, buf, n+1) == -1) //向管道里写数据
{
perror("write");
return -1;
}
}close(fd);
return 0;
}