您的位置:首页 > 运维架构 > Linux

Linux:进程间通信方式

2017-12-07 17:02 246 查看
概述

进程通信的目的:

数据传输
共享数据
通知事件
资源共享
进程控制

进程间通信的几种方式:

管道和有名管道
信号
消息队列
共享内存
信号量
套接字

管道通信

管道的通信方式分为无名管道和有名管道,无名管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制。



特点:

管道是半双工的,数据只能向一个方向流动;需要双方通信时,建立起两个管道。
只能用于父子进程或者兄弟进程之间。
单独构成一种独立的文件系统。管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件。不属于某种文件系统,而是自立门户,单独构成一种文件系统。并且只存在于内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

建立无名管道:

#include<stdio.h>
int pipe(int filedes[2]);

建立有名管道:

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

信号


信号本质:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断信号是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道到底什么时候到达。

信号来源:信号事件发生有两个来源,硬件来源(比如按下键盘或其他硬件故障);软件来源,最常用发生信号的系统函数是kill,raise,alarm,setitimer及sigqueue函数,软件来源还包括一些非法运算等操作。

分类: 
(1)从可靠性方面,分为可靠信号与不可靠信号 
(2)从时间方面,可分为实时信号与非实时信号


消息队列

管道只能传送无格式字节流,能够传送的信号量有限,消息队列(也称为报文队列)则克服了 这些缺点。 

消息队列是一个消息的链表,可以把消息看作是一个记录,具有特定的格式。

消息队列的执行步骤大致如下:

1.打开、创建 

2.发送信息 

3.接受信息 

4删除消息队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息