1. IPC介绍
什么是进程间通信呢?下面用一幅图来表示:
进程间通信,简称IPC,就是在不同进程之间传播或交换信息。
通信目的:共享资源、通知事件、数据传输、进程控制
进程间通信类型
有两种:
a. 无亲缘关系间通信,如上面的进程A 与B
b. 有亲缘关系间通信,如上面的进程B 与B’
示例:“父子进程在用户空间中不能直接交互数据”
参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
int main(int argc,char **argv)
{
pid_t pid;
int sync_flag = 0;
pid = fork();
if(pid == 0) // child process
{
int i;
while(sync_flag == 0);
for(i = 0; i < 5; i++)
{
printf("this is child process \n");
usleep(100);
}
}
else if(pid > 0) // parent process
{
int i;
for(i = 0; i < 5; i++)
{
printf("this is parent process \n");
usleep(100);
}
sync_flag = 1;
printf("the parent end \n");
}
while(1);
return 0;
}
运行结果:
以上代码,得出结论:
父子进程在用户空间中不能直接交互数据
2.IPC 发展历史
1)早期UNIX 进程间通信:主要包括无名管道、FIFO、信号
2)基于System V 进程间通信:主要包括System V 消息队列、System V 信号灯、System V 共享内存
3)基于POSIX 进程间通信:主要包括posix 消息队列、posix 信号灯、posix 共享内存
linux 下的进程通信基本上是从Unix 平台上的进程通信继承而来,所以继承早期UNIX 进程间通信,同时兼容了贝尔实验室的system V 与IEEE 的Posix 标准,所以实现linux 系统的进程间通信方式有:
1)管道(有名管道、无名管道)
2)信号signal
3)sysetm V IPC(共享内存、消息队列、信号量)
4)POSIX IPC(共享内存、消息队列、信号量)
各种通信方式的比较和优缺点
无名管道:速度慢,容量有限,只有父子进程能通讯
有名管道:任何进程间都能通讯,但速度慢
信号量:不能传递复杂消息,只能用来同步
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
共享内存区:能够很容易控制容量,速度快,但要保持同步