匿名管道:
pipe
#include <unistd.h>
pipe
#include <unistd.h>
int pipe(
int filedes[2]);
int filedes[2]);
1.创建描述符数组
2.把描述符数组变成管道
3.创建父子进程
4.父子进程分别读写描述符号。
2.把描述符数组变成管道
3.创建父子进程
4.父子进程分别读写描述符号。
#include <unistd.h>
#include <string.h>
int main(){
int fds[2];
pipe(fds);//创建管道
if(fork()){
char i = '0';
while(1){
write(fds[1],&i,1);//往管道写端写入数据
i++;
sleep(1);
}
}else{
char i;
int r;
while(1){
r = read(fds[0],&i,1);//阻塞函数,一定要读到数据才返回。
if(r>0)
write(0,&i,1);//打印到终端
else
write(0,"没收到",strlen("没收到")+1);
}
}
}
有名管道:
创建一个管道文件,两个进程都可以访问这个文件,并通过文件进行通信,比普通文件高级的地方在于,这个文件可看做一个队列,有序。
创建一个管道文件,两个进程都可以访问这个文件,并通过文件进行通信,比普通文件高级的地方在于,这个文件可看做一个队列,有序。
编程模型
A B
创建管道 mkfifo
打开管道 open 打开管道
使用管道 read/write 使用管道
关闭管道 close 关闭管道
删除管道 unlink system("rm");
A B
创建管道 mkfifo
打开管道 open 打开管道
使用管道 read/write 使用管道
关闭管道 close 关闭管道
删除管道 unlink system("rm");
数据无边界 有序 收发同步
接收
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(){
char name[20] = "first.pipe";
int r;
int fd;
char buff[256];
//1 创建管道文件
r = mkfifo(name,0666);
if(-1 == r) printf("mkfifo error:%m\n"),exit(-1);
printf("mkfifo %m\n");
//2 打开管道
fd = open(name,O_RDONLY);
if(-1 == fd) printf("open error:%m\n"),unlink(name),exit(-1);
printf("open %m\n");
//3 读管道
while(1){
r = read(fd,buff,sizeof(buff)-1);
if(r > 0){
buff[r] = 0;
printf(">>>%s\n",buff);
}
}
return 0;
}
发送
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(){
char name[20] = "~/first.pipe";
int fd;
int r;
char buff[256];
fd = open("/root/first.pipe",O_WRONLY);
if(-1 == fd) printf("open error:%m\n"),unlink(name),exit(-1);
printf("open %m\n");
while(1){
r = read(0,buff,256);
if(r > 0){
write(fd,buff,r);
}
}
return 0;
}