1、概念
管道:pipe,又称无名管道,是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。
它和有名管道、信号都是unix进程间通信方式。
2、用途
主要用于父进程与子进程之间,或者两个兄弟进程之间。
3、特点
7个,
①半双工。
数据在同一时候只能在同一个方向流动(举例:对讲机。全双工:手机,单工:遥控器)
②只存在于内存当中。
不是个普通的文件,不属于于文件系统(与普通文件的区别:无法通过open、close、read、write来操作管道文件,只能通过继承来获取文件描述符)
③没有名字。
只能在具有公共祖先的进程之间使用
④缓冲区大小固定。
linux中,管道的缓冲区大小事4kb。
⑤传输的数据时无格式的。
故要求读写双方约定数据格式、大小
⑥数据只能从管道一端读,一端写。
⑦读数据为一次性操作,一旦读走,数据被抛弃,释放空间。
4、使用方法
#include <unistd.h>
int pipe(int fd[2]);
功能:经由参数fd返回两个文件描述符
参数:
fd为int型数组的首地址,其存放了管道的文件描述符fd[0]、fd[1]。
fd[0]为读而打开,fd[1]为写而打开管道
返回值:
成功:返回 0
失败:返回-1
5、举例
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int fd_pipe[2];
char buf[] = "hello world";
pid_t pid;
if (pipe(fd_pipe) < 0)
perror("pipe");
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
write(fd_pipe[1], buf, strlen(buf));
_exit(0);
}
else
{
wait(NULL);
memset(buf, 0, sizeof(buf));
read(fd_pipe[0], buf, sizeof(buf));
printf("buf=[%s]\n", buf);
}
return 0;
}