消息队列的使用方法

来源:互联网 发布:国产三维cad软件 编辑:程序博客网 时间:2024/06/05 00:39

消息队列:
(1)消息队列是IPC对象的一种。
(2)消息队列由消息队列ID来唯一标识。
(3)消息队列就是一个消息的列表,用户可以在消息队列中添加消息、读取消息等。
(4)消息队列可以按照类型来发送接收消息。
(5)消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,这些消息又存在于内核中。
可以通过命令
ipcs -a查看所有的IPC对象使用情况
ipcs -m 查看共享内存
ipcs -q 查看消息队列
ipcs -s 查看信号灯集
ipcrm -m shmid 删除shmid的共享内存
ipcrm -q msgid 删除消息队列
ipcrm -s semid 删除信号灯集
int msgget(key_t key, int msgflg);
功能:创建或打开一个消息队列
参数:key:ftok返回值或者是IPC_PRIVATE创建私有消息队列
msgflg: IPC_CREAT、IPC_EXCL,创建时需要指定权限
返回值:成功返回msgid,失败返回-1
例如:msg_id=msgget(ftok("/",'a'), IPC_CREAT|IPC_EXCL|0666);

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列中发送消息
参数:msgid:消息队列的ID
msgp:存放消息的结构体指针
msgsz:消息正文的大小,就是mtext的大小,sizeof(msgbuf)-sizeof(long)
msgflg:设为0则直到发送完成函数才返回,IPC_NOWAIT 消息没有发送完成函数也会立即返回。
返回值:成功返回0,失败返回-1
结构体如下:
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
例如:
typedef struct msgbuf {
long mtype; //消息类型,读取的时候可以通过这个消息类型来读取指定的消息
char b[32]; //消息正文
}msg_t;
msg_t my_msg={1,“asdfqwerzxcv”};
msgsnd(msg_id,&my_msg,32,0);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
功能:从消息队列中读取指定类型的消息
参数:msgid:消息队列的ID
msgp:存放消息的结构体指针
msgsz:消息正文的大小
msgtyp:消息的类型,比如上面我发送的消息类型是1,那么这里写1,就会读取msgtyp=0的消息;写2的话,msgtyp=1的消息就不会被读取。
msgflg:0:若无消息函数会一直阻塞,IPC_NOWAIT:若没有消息,进程会立即返回ENOMSG。
返回值:成功返回读取到的消息长度,失败返回-1
例如:
typedef struct msgbuf {
long mtype; //消息类型,读取的时候可以通过这个消息类型来读取指定的消息
char b[32]; //消息正文
}msg_t;
msgrcv(msg_id,&my_msg,32,0,1,0);

int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
功能:对消息队列进行操作
参数:msgqid:消息队列的ID
cmd:IPC_STAT表示获取消息队列的信息
IPC_SET表示设置消息队列的信息
IPC_RMID表示删除消息队列
返回值:成功返回0,失败返回-1
struct 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) */
};
这个结构体里面描述了消息队列的相关信息,msgctl 可以通过读取和设置它们。
使用示例:


运行一下写端,通过命令ipcs -q会看到创建的消息队列的信息,我刚才写了两个进去,messages是2

我在运行两次,ipcs -q查看就会发生变化

现在我运行读端,消息对队里面的数据就会被读出来

相应的used-bytes、messages就会减少,而且只会读取消息的类型为2的数据,消息的类型为1的是不会读取的

直到消息的类型为2消息被读没,就会阻塞

消息的类型为1消息还会在消息队列里,直到被读取或消息队列被删除

原创粉丝点击