(一) 函数一览
key_t ftok(char *filename, int id) int msgget(key_t key, int msgflag)
int msgrcv(int msgid, struct msgbuf *msgptr, int msgsz, long msgtype, int msgflag) int msgsnd(int msgid, struct msgbuf *msgptr, int msgsz, int msgflag) int msgctl(int msgid, int cmd, struct msqid_ds *buf)
(二) 消息队列创建
函数:key_t ftok(char *filename, int id) 功能:产生key
参数: filename:linux系统中文件名(文件存在且可访问) 建
函数:int msgget(ket_t key, int msgflag) 功能: 1)返回与key相对应的消息队列描述子
2)或创建消息队列,当满足以下条件之一:
参数: key:
①消息队列中没有与该key对应的消息队列 ②key为IPC_PRIVATE
id:子序列号 失败:-1
返回值:成功:有效的key
备注:使用该key时要保证文件不被删除,否则key可能有变化,即使该文件删除后被重
ftok获得的key或指定的key
msgflag:取值:IPC_CREATE,IPC_EXCL,IOC_NOWAIT或者三者的或结果 失败:-1
返回值:成功:消息队列描述字
(三) 发送消息到到消息队列中
函数:int msgsnd(int msgid, struct msgbuf *msgptr, int msgsz, int msgflag)
功能: 向msgid代表的消息队列中发送一个消息,即将发送的消息存储在msgptr指向
的msgbuf中,长度由msgsz指定。
函数的阻塞条件为(未指定IPC_NOWAIT):
①当前消息大小与消息队列中已有消息字节之和大于消息队列大小限制 ②消息队列的消息数到达极限
函数解阻塞的条件(未指定IPC_NOWAIT):
①msgid代表的消息队列被删除 ②进程被信号中端
③消息队列有空间存储消息内容
msgbuf的指针
参数: msgid: 消息队列的标记ID
msgptr:
msgsz: msgbuf中文本串的长度
msgflag:设置函数是否阻塞(IPC_NOWAIT) 失败:-1
返回值:成功:消息队列描述字
(四) 从消息队列后中读取消息
函数:int msgrcv(int msgid, struct msgbuf, *msgptr, int msgsz, long msgtype, int msgflags)
功能:从msgid代表的消息队列中读取一个消息,消息内容存在msgptr中,消息内容大
小为msgsz,msgtype读取的消息类型。
函数解阻塞的条件(未指定IPC_NOWAIT):
①msgid代表的消息队列不存在 ②进程被信号中端 ③消息队列中有数据
msgbuf的指针
参数: msgid: 消息队列的标记ID
msgptr:
msgsz: msgbuf中文本串的长度 msgtype:msgbuf中消息类型
msgflag:设置函数是否阻塞(IPC_NOWAIT) 失败:-1
返回值:成功:读取消息的实际字节数
(五) 消息队列操作
函数:int msgctl(int msgid, int cmd, struct msqid_ds *buf) 功能:根据参数cmd的取值来对由msgid代表的消息队列进行操作 参数: msgid: 消息队列的标记ID
cmd: IPC_STA:获取消息队列信息,结果在buf指向的结构中
IPC_SET:设置消息队列属性,要设置的属性在buf指向的结构中 IPC_RMID:删除msgid代表的消息队列
返回值:成功:0
失败:-1
(六) 结构体
//该结构体由用户自定义 struct msgbuf { };
struct msqid_ds { };
struct ipc_perm {
key_t key; /* Key supplied to msgget(2) */ uid_t uid; /* Effective UID of owner */ gid_t gid; /* Effective GID of owner */ uid_t cuid; /* Effective UID of creator */ gid_t cgid; /* Effective GID of creator */ unsigned short mode; /* Permissions */ unsigned short seq; /* Sequence number */ };
struct ipc_perm msg_perm; struct msg struct msg
*msg_first; *msg_last;
// first message on queue, unused // last message on queue, unused // last msgsnd time // last msgrcv time // last msgrcv time
// current number of bytes on queue // number of messages in queue // max number of bytes on queue
// pid of last msgsnd // last recevid pid
long mtype;
//消息类型
char mtext[n]; //消息内容,n大小有用户指定
_kernel_time_t msg_stime; _kernel_time_t msg_rtime; _kernel_time_t msg_ctime; unsigned long unsigned long unsigned long unsigned long unsigned long
msg_lcbytes; msg_lqbytes; msg_cbytes; msg_qnum; msg_qbytes;
_kernel_ipc_pid_t _kernel_ipc_pid_t
msg_lspid; msg_lrpid;
因篇幅问题不能全部显示,请点此查看更多更全内容