无名管道特点
1)只能用于具有亲缘关系的进程之间的通信
2)半双工的通信模式,具有固定的读端和写端
3)管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数
4)向无名管道中写数据,一旦管道写满,则写操作阻塞,管道的大小为64K
5)当管道中无数据,执行读操作,读操作阻塞
6)对于无名管道的操作,属于一次性操作,
如果执行读操作,被读取的数据,将会从管道中清除
7)向无名管道中写数据,一旦管道写满,则写操作阻塞,当
管道中有4k以上的空间时,可以继续写入,写入4k整倍数
8)关闭读端,管道损坏之后,向管道中写数据,进程被终止(SIGPIPE)
9)如果管道中有数据,关闭写端,执行读操作,可以读到数据
之后再进行读操作,读操作不阻塞
创建管道的函数原型:int pipe(int pipefd[2]);
功能:创建一个无名管道
参数:pipefd 数组,保存管道的文件描述符
fd[0] 读端
fd[1] 写端
例程:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define N 64
int main(int argc, const char *argv[])
{
pid_t pid;
int fd[2];
char buf[N] = "";
if(pipe(fd) < 0){ /*创建无名管道*/
perror("pipe error");
return -1;
}
pid = fork(); /*创建两个线程*/
if(pid < 0){
perror("fork error");
return -1;
}
else if(pid == 0){ /*子进程 作为通信管道的写端*/
while(1){
fgets(buf, N, stdin); /*键盘输入数据*/
buf[strlen(buf) - 1] = '\0';
write(fd[1], buf, strlen(buf)); /*写入管道*/
if(strncmp(buf, "quit", 4) == 0){ /*一定模式退出,写端退出,读端能够正常读取,直到管道数据读取完毕*/
break;
}
}
}
else{ /*父进程 作为通信管道的读端*/
while(1){
read(fd[0], buf, N); /*读取管道中的数据*/
if(strncmp(buf, "quit", 4) == 0){
break;
}
printf("read:%s\n", buf);
}
}
return 0;
}