Linux系统进程间8种通信方法的主要特点

来源:互联网 发布:纳米盒一类的软件 编辑:程序博客网 时间:2024/06/05 06:42

不同进程间拥有相互独立的资源,为了可以实现进程间的通信,Linux内核实际上提供了一系列的系统调用接口,部分函数库在这些系统调用上又进行封装实现库函数进行进程间的通信。

这些通信方法有:信号、管道、共享内存、消息队列、信号量、互斥锁、条件变量、套接字

需要理解他们的工作过程,在此需要梳理一下这些方法的主要特点:

1.信号:

本质上是异步通信,通常由某些错误产生,产生后一般默认处理是退出。不过可以用信号注册函数更改对某种信号的处理。

2.管道:

特点是单向通讯(需要辨别阻塞与不阻塞模式下处理数据的特点)

无名管道:只能在同进程组间进行通信,(创建无名管道函数:int pipe(int fd[2])),其中往fd[0]中读,往fd[1]中写。

有名管道:命令行下 mkfifo+文件名 创建管道文件,该文件即管道,可以向该文件读写实现不同进程间通信,这种通信是阅后即焚的。

3.共享内存:

特点是可以进行大量数据传输,缺点是不是同步的。

可以使用互斥锁实现读写的同步;

使用过程是 创建 -> 映射 -> 断开 -> 删除。

4.消息队列:

特点是可以实现多个进程间的双向通信,缺点是传输的数据量小,仅可以传递一些控制信息

可以比喻成公共邮箱,所有的进程向这个公共邮箱发送消息,或者从这个邮箱取某一类型的消息。取出的消息将从邮箱中消失。从中可以看出消息是有类型的(用一个长整型的数据表示类型),同时它也遵守某些格式(消息的内容是一个结构体)。也可以看出不用关心不同类型的消息的发送先后顺序,取出消息将会取出目标类型的最早的消息。

5.信号量:

实现进程和线程之间的同步与互斥(主要是使用二元信号量),线程间的通信需要把信号量设为全局变量。

6.互斥锁:

本质上和二元信号量类似。

7.条件变量:

和互斥锁配合使用,在wait执行后则释放锁并且继续等待,可以使CPU执行其他线程,知道signal将它唤醒,唤醒后获取到锁继续执行。其中wait的判断条件一定要用实际的条件,并且用while循环判断是否继续执行wait,防止boardcast同时唤醒多个条件变量。

可以通过条件变量实现线程池的概念

8.套接字:

涉及到了网络通信部分,也可以实现不同进程间的通信。

0 0
原创粉丝点击