管道通信是常见的进程通信方式之一,其原理是借助操作系统,在内核区创建一块缓冲区,由两端的进程分别写入、读出数据。
创建管道的函数的原型:
int pipe(int filedes[2]);
其参数为一个大小为2的整形数组,在pipe()方法结束后,若管道创建成功,则该数组会被填入两个文件描述符,其中fd[0]默认为读端,fd[1]默认为写端。若创建失败,则返回值为-1。
管道通信特点:
(1)半双工,数据在同一时刻只能在一个方向上流动
(2)管道不是普通的文件,不属于某个文件系统,其只存在于内存中
(3)管道没有名字,只能在具有血缘关系的进程之间使用
(4)管道的缓冲区大小是有限的,在linux中,该缓冲区的大小固定为4k
代码示例:
#include<stdio.h>
#include<unistd.h>
void main() {
int pid;
int fd[2];
int res;
res = pipe(fd);
char *msg = "hello pipe";
char buffer[1024];
if (res == -1) {
perror("创建管道失败");
}
pid = fork();
if (pid > 0) {
// 父进程
close(fd[0]); //关闭读端
write(fd[1], msg, 11);
sleep(1);
close(fd[1]);
} else if (pid == 0) {
// 子进程
close(fd[1]); //关闭写端
res = read(fd[0], buffer, 11);
write(STDOUT_FILENO, buffer, res);
close(fd[0]);
}
}