linux消息队列的控制

消息队列创建成功后,内核创建了消息队列结构的同时,还创建了消息队列的控制结构。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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值