Linux进程间通信,一篇到位!
1)进程间通信介绍
什么是进程间通信?为什么需要进程间通信?
不同进程的进程标识符不同,且都拥有自己独立的虚拟地址空间,造成了进程的独立性。通过进程间通信,可以让不同进程进行协作(数据交换或者进程控制)。常见的进程间通信:网络就是一个应用最广泛的进程间通信,实现了不同用户的交互。
进程间通信的分类:
1.管道
- 匿名管道
- 命名管道
2.System V进程间通信
- System V 消息队列
- System V 共享内存
- System V 信号量
3.POSIX IPC进程间通信
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁
2)管道
什么是管道?
在shell中我们查看某个进程状态和PID的命令:ps -aux | grep test 这里的 | 就是管道符,这里的ps -aux和grep都可以理解为一个进程,把第一个进程的输出作为第二个的输入并进行操作
我们把从一个进程连接到另一个进程的一个数据流称为一个"管道"
管道本质: 管道也就是在内核当中开辟的一块内存,也可以称之为内核缓冲区,这段空间没有标识符。
用户态 : ps aux | grep xxx
内核态(缓冲区) : ps -aux被加载到缓冲区,然后给grep xxx
一、匿名管道
在内核中创建出来的一块内存是没有标识符的,所以管道也就没有标识符,那么怎么让其他进程也能够访问这块内存呢?
管道的创建: int pipe(int fd[2]);
fd[2]整形数组: 保存的是文件描述符,两个元素。其中fd[0]:读端,读匿名内存,fd[1]:写端,写入匿名内存,数据流向只能由写端—>流向读端
返回值: 成功返回0,失败返回-1
代码实现:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int fd[2];
if(-1==pipe(fd))
{
perror("pipe"); //创建失败就打印错误原因并退出
return -1;
}
printf("fd[0]=%d,fd[1]=%d\n",fd[0],fd[1]);
char buf[1024]={
0};
strcpy(buf,"Linux");
write(fd[1],buf,sizeof(buf)); //把buf的内容写入管道
memset(buf,0,sizeof(buf));
read(fd[0],buf