Linux进程入门学习(五)-IPC介绍

来源:互联网 发布:网络调研常见的方法 编辑:程序博客网 时间:2024/06/11 00:29

1. IPC介绍

什么是进程间通信呢?下面用一幅图来表示:
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;}

运行结果:
IPC_test
以上代码,得出结论:
父子进程在用户空间中不能直接交互数据

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(共享内存、消息队列、信号量)

各种通信方式的比较和优缺点
无名管道:速度慢,容量有限,只有父子进程能通讯
有名管道:任何进程间都能通讯,但速度慢
信号量:不能传递复杂消息,只能用来同步
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
共享内存区:能够很容易控制容量,速度快,但要保持同步