Linux进程间通信--消息队列
system v ipc
ipcs
- key:通信双方约定好的KEY值,32位的整形数据
id :系统会为IPC分配一个唯一的ID,通信双方都需要知道ID才能使用当前IPC方法,创建者会返回当前ID值,
include
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
. proj_id
key 31-24 proj_id 低8位
key 23-16 st_dev属性的低8位
key 15-0 st_ino属性的低16位
对象
拥有者及权限对象
struct ipc_perm
{__kernel_key_t key;
__kernel_uid_t uid;
__kernel_gid_t gid;
__kernel_uid_t cuid;
__kernel_gid_t cgid;
__kernel_mode_t mode;
unsigned short seq;
};
XSI消息队列
对象:
struct msqid_dsstruct msqid_ds {
struct ipc_perm msg_perm; /* Ownership and permissions */
time_t msg_stime; /* Time of last msgsnd(2) */
time_t msg_rtime; /* Time of last msgrcv(2) */
time_t msg_ctime; /* Time of last change */
unsigned long __msg_cbytes; /* Current number of bytes in queue (nonstandard) */
msgqnum_t msg_qnum; /* Current number of messages in queue */
msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */
pid_t msg_lspid; /* PID of last msgsnd(2) */
pid_t msg_lrpid; /* PID of last msgrcv(2) */
struct msg * msq_first ;
struct msg * msq_last ;
};
优点和缺点
优点:
- 消息队列是两个不相关进程之间传递数据的有效渠道.
与命名管道相比,具有的优势是:
独立于发送以及接收进程而存在;
消除命名管道的打开以及关闭而存在的困难;
可以提前查看紧急信息;
避免命名管道的同步以及阻塞问题;
缺点:
与命名管道一样,每个数据块都有一个最大长度限制;
系统中所有队列包含的全部数据块长度也有一个上限;创建对象:
int msgget(key_t key, int msgflg);int msgget(key_t key, int msgflg);
key_t key
int msgflg 确定消息队列的访问权限,
IPC_CREAT 找到当前的key对应的IPC,如果没有IPC则进行创建
IPC_EXCL 如果存在则返回失败
IPC_NOWAIT 返回值为当前ipc对应的id值
设置对象:
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
cmd:
IPC_RMID 删除
IPC_SET 设置ipc_perm参数
IPC_STAT 获取ipc_perm参数
IPC_INFO 获取ipc信息 和ipcs
使用对象:
发送
int msgsnd(int msqid,const void *msg_ptr,size_t sz,int msgflg);
struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
接收
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msgtyp 0 默认接收第一条消息
msgtyp > 0 接收第一条msgtyp消息
msgtyp < 0 接收小于msgtyp绝对值的消息早期的版本,现在根据Ubuntu的版本不一样可能会有出入
msgmni 最大消息队列数 16
msgmax 最大消息长度(字节数) 8192
msgmnb 消息队列中的最大字节数 16384
还没有评论,来说两句吧...