Linux进程通信之消息队列

来源:互联网 发布:java数组 编辑:程序博客网 时间:2024/06/08 18:02

1.     消息队列

1)     概念:消息的一个链表,运行一个或多个进程向它写消息,也运行一个或多个进程向它读消息。

2)     操作

msgget:创建和打开队列,其消息数量受系统限制。

int msgget (key_tkey, int flag)

   key:返回新的或已有队列的ID,IPC_PRIVATE

 

       msgsnd:添加消息,将消息添加到消息队列尾部。

int msgsnd (int msqid, struct msgbuf              *msgp, size_t msgsz, int flag)

       其中:msqid是消息队列的队列ID;

n   msgp是消息内容所在的缓冲区;

n   msgsz是消息的大小;

n   msgflg是标志,IPC_NOWAIT若消息并没有立交发送而调用进程会立即返回。

 

       msgrcv:读取消息,从消息队列中取走消息。

int msgrcv (int msqid, struct    msgbuf*msgp, size_t msgsz,long      msgtyp, intflag)

n   msqid是消息队列的引用标识符;

n   msgp是接收到的消息将要存放的缓冲区;

n   msgsz是消息的大小;

n   msgtyp是期望接收的消息类型;

n   msgflg是标志。

 

msgctl:控制消息队列。

int msgctl (intmsqid, int cmd, struct msqid_ds *buf)

msqid是消息队列的引用标识符;

cmd是执行命令;

buf是一个缓冲区。

cmd参数指定对于由msqid规定的队列要执行的命令:

n   IPC_STAT 取此队列的msqid_ds结构,并将其存放在buf指向的结构中。

n   IPC_SET 按由buf指向的结构中的值,设置与此队列相关的结构中的下列四个字段:

       msg_perm.uid、msg_perm.gid、msg_perm;mode和msg_qbytes。此命令只能由下列两种进程执行:一种是其有效用户ID等于msg_perm.cuid或msg_perm.uid;另一种是具有超级用户特权的进程。只有超级用户才能增加msg_qbytes的值。

n   IPC_RMID 从系统中删除该消息队列以及仍在该队列上的所有数据。这种删除立即生效。仍在使用这一消息队列的其他进程在它们下一次试图对此队列进行操作时,将出错返回EIDRM。

 

0 0