管道通信的特点
- 管道是半双工的,先进先出的,它把一个进程的输出和另一个进程的输入连接在一起
- 一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据
无名管道和有名管道分别适用的进程
- 无名管道用于 父子进程之间 的通信
- 有名管道用于 运行同一个系统中的任意两个进程间 的通信
无名管道和有名管道创建的步骤
- 无名管道:创建管道——读管道——写管道——关闭管道
- 有名管道:创建管道——删除管道——打开管道——关闭管道——读管道——写管道
管道用于不同进程间的通信,通常先创建一个管道,在通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道
管道通信函数
int pipe(int filedes[2])
- 参数:新建的两个描述符由filedes数组返回。
- filedes[0]表示管道的读取端,filedes[1]表示管道的写入端
- 返回值:成功:0;出错:-1
- 头文件:#include<unistd.h>
无名管道
#include <stdlib.h>
#include <stdio.h>
#include <zconf.h>
#include <cstring>
int main() {
// 创建无名管道
int fd[2];
if (pipe(fd) == -1)
exit(1);
// 管道传递信息
char msgSend[] = "我在写呢";
char msgRecv[32];
int pid = fork();
if (pid == 0) {
// 子进程
close(fd[1]); // 关闭管道写入端,准备读
printf("before read data from pipe!\n");
read(fd[0], msgRecv, strlen(msgSend)); // 把信息读入msgRecv
printf("read [%s] from pipe\n", msgRecv);
} else {
// 父进程
close(fd[0]); // 关闭管道读取端,准备写
printf("Parent sleeping ......\n");
sleep(3); // 迫使子进程先执行
printf("Parent wake up !\n");
write(fd[1], msgSend, strlen(msgSend));
wait(0);
}
exit(0);
}
运行结果
Parent sleeping ......
before read data from pipe! // 等待3s
Parent wake up !
read [我在写呢] from pipe
Process finished with exit code 0