您的位置:首页 > 运维架构 > Linux

linux消息队列的控制

2014-08-27 16:18 369 查看
消息队列创建成功后,内核创建了消息队列结构的同时,还创建了消息队列的控制结构。msgqid_ds,该结构制定了消息队列的权限信息,发送接收消息的进程,时间戳等信息。

提供了专门的函数控制这个结构,msgctl;

现在创建一个案例:获取一个刚刚建立的队列的读写权限,并将读写权限置为对所有用户只读,最后删除队列消息。

首先以IPC_STAT为参数调用msgctl获取消息队列的权限信息,然后调用IPC_SET将所有的用户的写权限屏蔽,屏蔽后调用msgsnd向队列发送消息,看看是否已经修改为只读了

最后以IPC_RMID为参数调用msgctl将队列删除。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
typedef struct
{
long int nType;
char szText[256];
}MSG;
int main()
{
key_t lKey;
int n,nMsgId;
MSG msg;
struct msqid_ds qds;//消息队列控制结构变量
if((lKey = ftok("/etc/profile",1)) == -1)//这个已经根据这个键值创建过一次了
{
perror("ftok");
exit(1);
}
if((nMsgId = msgget(lKey,0)) == -1)
{
perror("ftok");
exit(2);
}
memset(&qds,0x00,sizeof(struct msqid_ds));
if(msgctl(nMsgId,IPC_STAT,&qds) < 0)//设置消息队列的权限
{
perror("msgctl IPC_STAT");
exit(3);
}
printf("msg_perm.mode=%d\n",qds.msg_perm.mode);//输出消息的访问权限
qds.msg_perm.mode &= (~0222);//去除消息的写权限
if(msgctl(nMsgId,IPC_SET,&qds) < 0)//设置消息队列的权限
{
perror("msgctl IPC_SET");
exit(4);
}
memset(&msg,0x00,sizeof(MSG));
msg.nType = 2;
memcpy(msg.szText,"12345",5);
if(msgsnd(nMsgId,(void *)&msg,5,0) < 0)//发送消息
{
perror("msgsnd");
}
if(msgctl(nMsgId,IPC_RMID,NULL) < 0)//删除消息队列
{
perror("msgctl IPC_RMID");
exit(5);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: