进程间通信——管道
一、进程间通信
1、进程间通信的目的
* 数据传输:一个进程需要将他的数据发送给另一个进程
* 资源共享:多个进程之间共享同样的资源
* 通知事件:一个进程需要向另一个进程(组)发送消息,如子进程终止时要通知父进程
* 进程控制:有些进程希望完全控制另一个进程(如Debug),此时,控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道他的状态改变
2、进程间通信的分类
* 管道
匿名管道
命名管道
* System V IPC
System V IPC 消息队列
System V IPC 共享内存
System V IPC 信号量
* POSIXIPC
消息队列
共享内存
信号量
互斥量
条件变量
读写锁
二、管道
1、管道是什么?
管道是进程间通信方式的一种,依赖于文件系统
2、管道的调用原理
* 通过fork()让父子共享文件,关闭都写端形成单向通信,进而让父子间通信
3、管道的特点:
* 匿名管道——亲缘关系(父子,兄弟)间通信
* 面向字节流
* 单向通信
* 自带同步机制
* 生命周期随进程
4、匿名管道与命名管道的区别
——匿名管道由pipe函数创建并打开
int pipe (int fd[2]);
fd:文件描述符数组
fd[0]:读端
fd[1]:写端
返回值:成功返回0,失败返回错误代码
——命名管道由mkfifo函数创建,打开用open
从命令行创建:$ mkfifo filename 创建管道文件
从程序里创建:int mkfifo(const char *filename, mode_t mode)
filename:文件名,可以指定路劲
mode:权限
返回值:成功返回0,失败返回-1
——FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在他们打开的方式不同
三、匿名管道间通信
1、
子进程写,父进程读
先fork()出子进程,让父子进程文件共享,然后关闭子进程的读端和父进程的写端
运行结果:父进程收到了子进程发出的消息
2、管道读写的四种情况
3、管道是面向字节流的
写端快,读端慢,写端不停的写入消息,而读端5s后会一次性读取
四、命名管道
没有任何关系的进程间通信
下面是两个没有关系的进程间通信,采用命名管道
baobao.c
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
int main()
{
if(mkfifo("./fifo",0644) < 0){
perror("mkfifo");
return 1;
}
int fd = open("./fifo", O_RDONLY);//read
if(fd < 0){
perror("open");
return 2;
}
char buf[1024];
while(1){
// printf("Plase Enter: ");
// fgets(buf, sizeof(buf), stdin);
ssize_t s = read(fd, buf, sizeof(buf)-1);
if(s > 0){
buf[s] = 0;
printf("baobao:>%s\n",buf);
}else if(s==0){
printf("baobao quit!\n");
break;
}else{
perror("read");
}
}
close(fd);
return 0;
}
zhutou.c
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fd = open("./fifo", O_WRONLY);//write
if(fd < 0){
perror("open");
return 1;
}
char buf[1024];
while(1){
printf("Plase Enter: ");
fgets(buf, sizeof(buf), stdin);
write(fd, buf, strlen(buf));
}
close(fd);
return 0;
}
上一篇: 命名管道和匿名管道