进程间通信系列(9)消息队列的创建、打开、控制

来源:互联网 发布:渗透理论 复杂网络 编辑:程序博客网 时间:2024/05/20 01:35

消息队列的特性:

1.消息队列是内核中的链表;

2.用户将数据传送给内核后,内核重新添加一些如用户ID、组ID、读写进程的ID和优先级等

  相关信息后并打成一个数据包称为消息;

3.允许一个或者多个进程往消息队列中写消息和读消息,但一个消息只能被一个进程读取,

  读取完毕后就自动删除;

4.消息队列具有一定的FIFO特性,消息可以按照顺序发送到队列中,也可以几种不同的方式

  从队列中读取。每一个消息队列在内核中用一个唯一的IPC标识ID表示;

5.消息队列的实现包括创建和打开队列、发送消息、读取消息和控制消息队列四种操作。

消息队列属性结构体
struct msqid_ds {struct ipc_perm msg_perm;         /* Ownership and permissions*/unsigned long  __msg_cbytes;      /* Current number of bytes in  queue (non-standard) */msgqnum_t      msg_qnum;          /* Current number of messages  in queue */msglen_t       msg_qbytes;        /* Maximum number of bytesallowed in queue */pid_t          msg_lspid;         /* PID of last msgsnd() */pid_t          msg_lrpid;         /* PID of last msgrcv() */time_t         msg_stime;         /* Time of last msgsnd() */time_t         msg_rtime;         /* Time of last msgrcv() */time_t         msg_ctime;         /* Time of last change */};

创建和打开消息队列
#include <sys/msg.h>

int msgget(key_t key, int flag);

返回:成功返回内核中消息队列的标识符ID,出错返回-1

参数:

key:用户指定的消息队列键值

flag:IPC_CREAT, IPC_EXCL等权限组合

若创建消息队列,key可指定键值,也可将之设置为IPC_PRIVATE。若打开进行查询,则key
不能为0,必须是一个非零的值,否则查询不到。

消息队列控制

#include <sys/msg.h>

int msgctl(int msgid, int cmd, struct msqid_ds *buf);

返回:成功返回0,出错-1


参数:

msgid:消息队列ID

buf:消息队列属性指针
cmd:

IPC_STAT 获取消息队列的属性,取此队列的msqid_ds结构,并将其存放在buf指向的结构中;

IPC_SET 设置属性,按由buf指向的结构中的值,设置与此队列相关的结构中的字段;

IPC_RMID 删除队列,从系统中删除该消息队列以及仍在该队列上的所有数据;
0 0