Linux进程间通信

文章目录

  • 1.Linux下进程间通信概述
    • 1.1 概述
    • 1.2 名词解释
  • 2.管道
    • 2.1 无名管道
    • 2.2 有名管道
  • 消息队列
    • 操作
    • 典型的基于msq的CS模型
  • 进程间通讯方式比较

1.Linux下进程间通信概述

1.1 概述

  • Linux下的进程通信手段基本上是从UNIX平台上继承发展而来的。但UNIX的两大贡献者AT&T贝尔实验室与BSD(加州伯克利软件发布中心)在进程通信方面各有侧重。
  • AT&T侧重对UNIX早期的进程间通信手段进行改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;
  • BSD侧重基于套接口(socket)的进程间通信机制,其通信进程扩展到不同的计算机中
  • Linux则把两者的优势都继承了下来。
  • Linux进程间通信
    Linux进程间通信_第1张图片

1.2 名词解释

(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信;有名管道除具有管道所具有的功能外,还允许无亲缘关系进程间的通信。

(2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。

(3)消息队列(Messge Queue):消息队列是消息的链接表,包括Posix消息队列与SystemV消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息,对消息队列有读权限的进程则可以从消息队列中读取消息。

(4)共享内存(Shared memory):这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等来辅助实现。

(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。

(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

2.管道

2.1 无名管道

2.2 有名管道

Linux进程间通信_第2张图片

消息队列

  • 消息队列是IPC对象的一种。
  • 消息队列由消息队列ID来唯一标识。
  • 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。
  • 消息队列可以按照类型来发送/接收消息。

操作

  • 消息队列的操作包括创建或打开消息队列、添加消息、读取消息和控制消息队列
  • 创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制
    Linux进程间通信_第3张图片
  • 添加消息使用的函数是msgsnd,按照类型把消息添加到已打开的消息队列末尾
    Linux进程间通信_第4张图片
  • 读取消息使用的函数是msgrcv,可以按照类型把消息从消息队列中取走
    Linux进程间通信_第5张图片
  • 控制消息队列使用的函数是msgctl,它可以完成多项功能。
    Linux进程间通信_第6张图片

典型的基于msq的CS模型

Linux进程间通信_第7张图片

/* msgrcv.c */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define  BUFFER_SIZE		512

struct message
{
	long msg_type;
	char msg_text[BUFFER_SIZE];
};
int main()
{
	int qid;
	key_t key;
	struct message msg;
	
	/*根据不同的路径和关键表示产生标准的key*/
	if ((key = ftok(".", 'a')) == -1)
	{
		perror("ftok");
		exit(1);
	}
	
	/*创建消息队列*/
	if ((qid = msgget(key, IPC_CREAT|0666)) == -1)
	{
		perror("msgget");
		exit(1);
	}
	printf("Open queue %d\n", qid);
	      do
          {
	/*读取消息队列*/
	memset(msg.msg_text, 0, BUFFER_SIZE);
	if (msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0) < 0)
	{
		perror("msgrcv");
		exit(1);
	}
	printf("The message from process %d : %s", msg.msg_type, 
                                                                                               msg.msg_text);
		
           } while(strncmp(msg.msg_text, "quit", 4));
	        /*从系统内核中移走消息队列 */
        if ((msgctl(qid, IPC_RMID, NULL)) < 0)
            {
	  perror("msgctl");
	   exit(1);
            }
	
       exit(0);
}

进程间通讯方式比较

  • pipe: 具有亲缘关系的进程间,单工,数据保存在内存中。
  • fifo: 可用于任意进程间,双工,有文件名,数据在内存。
  • signal: 唯一的异步通信方式。
  • msg:常用于cs模式中, 按消息类型访问 ,可有优先级。
  • shm:效率最高(直接访问内存) ,需要同步、互斥机制。

你可能感兴趣的:(嵌入式系统设计)