目录:
1. 半双工管道
2. 命名管道
3. 消息队列
4. 信号量
5. 信号
6. 共享内存
3 消息队列
3.1 特点
- 消息队列是内核地址空间中的内部链表,通过内核在进程之间传递内容。
-
消息顺序的发送到消息队列中,并以不同的方式从队列中获取。
消息队列工作流程
3.2 基本知识
3.2.1 ftok()函数
ftok()函数用于使用路径名和项目表示符构建一个键值。
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(
const char *pathname, //已经存在的目录
int proj_id //8位的值,通常a,b
);
调用成功返回0,失败返回-1.
3.2.2 msgget()函数
创建一个新的消息队列或者访问一个现有的队列。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(
ket_t key,
int msgflag
);
- key:键值,可以用ftok()生成
- msgflag:
IPC_CREATE 如果队列不存在则创建一个;
IPC_EXCL 与IPC_CREATE一起使用时,如果队列已存在则报错。 - 调用成功返回一个消息队列的标识符,失败返回-1.
3.2.3 msgsnd()&msgrcv()函数
msgsnd()&msgrcv()分别用于向队列传递消息和从队列中接受消息。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(
int msgid,
const void *msgp,
size_t msgsz,
int msgflg
);
- msgid:队列标识符,由msgget()返回。
- msgp:指向消息缓冲区,消息缓冲区的结构如下:
mytype代表消息类型,以正数表示,由用户自己设定;#include <linux/msg.h> struct msgbuf{ long type; char mtext[1]; };
mtext存储消息数据,不一定是char,类型的大小根据需要确定。 - msgsz:消息大小,以字节为单位,不包括消息类型(type)的大小。
- msgflg:
取值为0,表示忽略;
取值为IPC_NOWAIT时:待验证 - 成功返回0,失败返回-1.
int msgrcv(
int msgid,
void *msgp,
size_t msgsz,
long msgtyp,
int msgflg
);
- mstyp:指定要从消息队列中获取的消息类型,如果为0则将获得队列中最老的消息。
- msgflg:待验证
- 其他参数与msgsnd()相同。
- 成功返回0,失败返回-1.
3.2.4 msgctl()函数
在消息队列上执行控制操作.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(
int msgid,
int cmd,
struct msgid_ds *buf
);
- cmd:内核根据此来判断进行何种操作。IPC_STAT,获取队列的msgid_ds结构,并放置在buf中;IPC_SET,将buf的值赋予msgid_ds的ipc_perm成员;IPC_RMID,内核中删除此队列。











网友评论