1.消息队列:
unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带
来不便。消息队列(也叫做报文队列)则克服了这些缺点。
消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式.进程可以向中按照一定的规则添加新消息;
另一些进程则可以从消息队列中读走消息。
消息队列的实现包括创建或打开消息队列,添加消息,读取消息和控制消息队列这四种操作:
(1)创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制。
(2)添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队列末尾。(3)读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消
息。
(4)控制消息队列使用的函数是msgctl,它可以完成多项功能。
消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必
须提供该消息队列的键值。
2.有关消息队列操作的几个函数:(1)ftok
函数的作用:把一个文件名和数字转成键值;
函数的原型:key_t ftok(const char *pathname, int proj_id);
函数的 参数:pathname:一个存在的可以访问的路径文件名;
proj_id:不为0 的一个数字,返回值:成功键值,出错-1;
(2)msgget
函数的作用: 创建打开消息队列;
函数的原型: int msgget(key_t key, int msgflg);
参数: key:键值;多个进程可以通过访问它访问同一个共享内存,其中有个特殊值IPC_PRIVATE,它用于创建当
前进程的私有共享内存。
msgflg:权限标志位;
返回值: 成功返回消息队列ID;出错-1;
头文件:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
(3)msgsnd,
函数的作用:向消息队列中写内存写内容;
函数的原型:int msgsnd(int msgid, const void *msgp,size_t msgsz, int msgflg);
函数的参数:msgid: 消息队列的ID;
msgp: 指向消息结构的指针。消息结构:struct msgbuf
{
long mtype;char mtext[];
}
msgsz: 消息正文的字节数;
msgflg:IPC_NOWAIT, 消息无法立即发送则返回;
0: 调用阻塞直到发送成功为止;
返回值: 成功0,出错-1;
(4)msgrcv
函数的作用:从队列中读取数据;
函数的原型:int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtype, int msgflg);
函数的参数:msqid:消息队列的ID;msgp:消息缓冲区,
msgsz:消息正文的字节数;
msgtyp:=0,接收消息队列中第一个消息;
>0,接收消息队列中第一个类型为msgtyp的消息;
<0, 接收消息队列中第一个类型值不小于msgtp绝对值且;类型值有最小的消息;
msgflg:MSG_NOERROR:如果队列中满足条件消息的内容大于所请求的msgsz字节,则消息就会截 断到msgsz字节,且不通知消息发送进程。
IPC_NOWAIT:没等到相应的消息就返回
0:阻塞直到接收到消息返回值:成功0,出错-1;
(5)msgctl
函数的作用: 控制消息队列
函数的原型:int msgctl(int msgid, int cmd, struct msgid_ds *buf);
函数的参数:cmd: IPC_STAT:读取消息队列的数据结构,并将其存储在buf指定的地址中。IPC_SET:设置消息队列的数据结构中的IPC_PERM域值,这个值取自buf参数。
IPC_RMID:从系统中删除消息队列。
buf: 描述消息队列的msgqid_ds的结构类型变量;
返回值: 成功0,出错-1;