共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。这种高效率带来的问题第,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。因此,共享内存通常和其他进程间通信方式一起使用。
Linux共享内存的API都定义在sys/shm.h头文件中
shmget系统调用创建一段新的共享内存,或者获取一段已经存在的共享内存。定义如下:
#include<sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);
key参数是一个是一个键值,用来标识一段全局唯一的共享内存。size参数指定共享内存的大小,单位是字节。如果是创建新的共享内存,则size值必须被指定。如果是获取已经存在的共享内存,则可以把size设置为0,shmflag是标志位:包括SHM_HUGETLB:系统将使用“大页面”来为共享内存分配空间。SHM_NORSERVE:不为共享内存保留交换分区。
shmget成功时返回一个正整数值,它是共享内存的标识符。shmget失败时返回-1,并设置errno.如果shmget用于创建共享内存,则这段共享内存的所有字节都被初始化为0。
消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。
Linux消息队列的API都定义在sys/msg.h头文件中
msmget系统调用创建一个消息队列,或者获取一个已经有的消息队列。其定义如下:
#include<sys/msg.h>
int msgget(key_t key,int msgflg);
key参数是一个键值,用来标识一个全局唯一的消息队列。msgflag参数为标志。该函数成功时返回一个正整数值,它是消息队列的标识符。失败时返回-1,并设置erron(《Linux高性能服务器编程》)