目录
system V IPC 消息队列
消息队列的结构分析
消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。
系统调用接口
msgget创建或者获取一个消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
参数key用ftok()函数获取,msgflg使用IPC_CREAT and IPC_EXCL+权限
msgsnd发送信息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
【参数说明】
- msqid为消息队列的描述符
- msgp为一个结构体的地址,该结构定义的类型为{long type; char mtext[0]},type标识数据类型,后面的为柔性数组,存储要发送的信息的
- msgsz发送信息的大小
- msgflg参数控制msgsnd的行为。它通常仅支持IPC_NOWAIT标志,即以非阻塞的方式发送消息。默认情况下,发送消息时如果消息队列满了,则msgsnd将阻塞。若IPCNOWAIT标志被指定,则msgsnd将立即返回并设置errno为EAGAIN。
msgrcv获取信息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msgtyp:表示读取数据块的类型
msgctl 控制属性
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
简单的用途就是用来释放消息队列IPC_RMID
system V IPC 信号量
互斥的四个概念
公共资源:所有进程之间都能看到。
- 互斥:任何一个时刻,都只允许一个执行流在进行共享资源的访问 - 加锁
- 我们把任何一个时刻,都只允许一个执行流在进行访问的共享资源,叫做 临界资源
- 临界资源是要通过代码访问的,凡是访问临界资源的代码,叫做临界区。
- 原子性:要么不做,要么做完,只有两种确定状态的属性
初识信号量 感性认识
类比小故事
信号量/信号灯的本质就是一个计数器!描述资源数量的计数器。计数器为1则就是互斥功能!
任何一个执行流想要访问一个临界资源的一个子资源的时候,不能直接访问。
系统接口
semget:创建或者打开一个信号量集
semctl:信号量控制操作
system V IPC 信号量详细介绍见:http://t.csdn.cn/1qv6w