狐狸梦见乌鸦

当坚持成为一种习惯,目标将不在遥远```
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

共享内存-消息队列-----学习笔记

Posted on 2012-01-06 19:09  灬啊U  阅读(1051)  评论(0编辑  收藏  举报

2012-1-6

IPC对象:共享内存、消息队列、信号量(信号灯集)

key  :IPC_PRIVATE和ftok的返回值。。。。。  常用: key = IPC_PRIVATE 只能自己或者具有血缘关系的使用

1.ftok()函数:

key_t  ftork(“路径”, id)

路径使用自己的工作目录,避免了key冲突。 id  任意指定一个字母,即key由路径+id组成。。。。

 

2.共享内存

特点一:效率最高的一种进程间通信。。。。(数据吞吐量大时才能体现出优势)

共享内存必须依靠同步机制使用

共享内存的使用步骤:

创建共享内存   必须判断 EEXIST   IPC_CREAT|0666 ----权限

shmget(key, size,IPC_CREAT|0666)返回一个shmid号          system(ipcs -m)查看     ipcrm –m 删除

映射共享内存

使用完取消共享内存映射

删除共享内存对象   IPC_RMID(删除对象)(所有进程都不使用这个共享内存时,则最后一个使用它的进程,删除IPC对象)

 

同步---通信

A:从终端读一个数据

开始

创建共享内存(成功则往下执行)(IPC_EXCL判断)失败则打开

映射

先写入 pid(填充结构体)

等待信号(pause())

被唤醒后读终端

发信号唤醒B

 

B:开始

打开共享内存

映射

读对方的id,写自己的id

发信号----唤醒A

等待pause()

打印完---发信号

在等待

 

 

 

IPC  消息队列

struct msgbuf

{

         long  mtype; 消息类型

         char  mtex [N]; 消息正文

};

创建:int msgget(key, 权限) 权限:IPC_CREAT|0666   成功返回消息队列的ID,错误返回-1

添加:int msgsnd(msgid, &mybuf, sizeof(struct addrbuf)- sizeof(long), 0)

读取:int msgrcv(msgid, &mybuf,BUFSIZE, mybuff。type,  0)

删除:int msgctl (msgid, IPC_RMID,  0)