IPC对象、共享内存和消息队列

  IPC对象包括:是活动在内核级别的一种进程间通信的工具,是一种机制目前Linux也支持这三种机制:共享内存、消息队列、信号灯集

1、IPC

struct ipc_perm
{
key_t key; 关键字
uid_t uid; /*共享内存所有者的有效用户ID */
gid_t gid; /* 共享内存所有者所属组的有效组ID*/ 
uid_t cuid; /* 共享内存创建 者的有效用户ID*/
gid_t cgid; /* 共享内存创建者所属组的有效组ID*/
unsigned short mode; /* Permissions + SHM_DEST和SHM_LOCKED标志*/
unsignedshort seq; /* 序列号*/
};

key比较关键,是识别这个共享通道的钥匙。
在这三种机制中都会用到这个创建的key;

一般用 ftok这个函数来创建钥匙。

key_t ftok( char * fname, int id ) 
例如:
if ((key = ftok(".", 's')) < 0)
{
perror("fail to ftok");
exit(-1);
}

这样就产生了一个key,其实也可以自己定义key,但是这样定义的key不安全。所以尽量用ftok来产生key。

2、共享内存:

它是一种最为高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝为了在多个进程间交换信息,

内核专门留出了一块内存区,可以有需要访问的进程将其映射到自己的私有地址空间,所以内核就不需要数据拷贝的操作,

这样子一来就提高了进程的效率(内核来处理问题比进程来的快)。

而实现共享内存有2个步骤:1、在内核中创建出一块共享内存。(shmget())

            2、将共享内存映射到进程的映射区。(shmat())

            3、撤销映射的操作。(shmdt())


3、消息队列:

顾名思义,消息队列就是一些消息的列表,使用者可以在队列中添加和读取消息等操作。

在某些方面(主要是读取操作)与FIFO的一些特性很相像,甚至可以说就是一样的。但是比FIFO更有优势,因为它可以实现消息的随机查询。

这些消息存在内核中,都有一个“队列ID”来标识。

实现消息队列有4步骤:1、创建或打开队列(msgget()),创建队列的数量受到系统消息队列的限制。

2、添加消息(msgsnd()),把消息添加到已打开的消息队列的末尾。

3、读取消息(msgrcv()),根据“队列ID”取走消息队列中指定的消息。

4、控制消息队列(msgctl()),消息队列的移除撤销。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值