消息队列

#include <stdio.h>
#include<sys/msg.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
void CHECK( int ret , char *p  )
{

    if ( ret ==-1 )
    {
        perror(p);
    }
}
typedef  struct my_msg{
    long  tpye;
    char p[1024];
}my_msg;
int main()
{
    int msgid= msgget(1000,IPC_CREAT|0666);
    CHECK(msgid,"msgget");
    int ret;
    my_msg pmsg,prmsg;
    pmsg.tpye= 1;
    strcpy(pmsg.p,"helloworld\n");
    
    if ( fork()==0)
    {
        sleep(1);

        ret = msgrcv(msgid,&prmsg,sizeof(prmsg.p),1,0);
        CHECK(ret, "msgrcv");
        printf("%s",prmsg.p);
        ret = msgrcv(msgid,&prmsg,sizeof(prmsg.p),2,0);
        CHECK(ret,"msgrcv");
        printf("%s",prmsg.p);
        
    }else{
        ret = msgsnd(msgid,&pmsg,sizeof(pmsg.p),0);
        CHECK(ret , "msgsnd");
        pmsg.tpye =2;
        strcpy(pmsg.p,"l love you\n");
        ret = msgsnd(msgid, &pmsg,sizeof(pmsg.p),0);
        CHECK(ret, "msgsnd");
        wait(NULL);
    }
    msgctl(msgid, IPC_RMID , NULL);
    return 0;
}

如何查看内核中的消息队列的最大长度
cd /etc/sys/kernel 目录下
四个函数 msgget() msgsnd() msgrcv() msgctl ()
msgget() int msgget(key_t, key, int msgflg);
在内核中创建一个消息队列 维护一个msgid_ds的数据结构,msg_first msg_last 分别指向头和尾部。
key 值,自定义。
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
flag 默认0即可 ,msg_ptr,为自定义的结构体

//测试消息队列的数目是多少  16 
#include <stdio.h>
#include<sys/msg.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
void CHECK( int ret , char *p  )
{

    if ( ret ==-1 )
    {
        perror(p);
    }
}
typedef  struct my_msg{
    long  tpye;
    char p[1024];
}my_msg;
int main()
{
    int msgid= msgget(1000,IPC_CREAT|0666);
    CHECK(msgid,"msgget");
    int ret;
    my_msg pmsg,prmsg;
    pmsg.tpye= 1;
    strcpy(pmsg.p,"helloworld");
    int i=0 ; 
    if ( fork()==0)
    {
        sleep(1);

    

    }else{
        while(1){
            ret = msgsnd(msgid,&pmsg,sizeof(pmsg.p),0);
            i++;
            if ( ret == -1 )
            {
                break;
            }
           
            printf("%d\n",i);
        }
        wait(NULL);
    }
    msgctl(msgid, IPC_RMID , NULL);
    return 0;
}

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
接收固定的类型的消息,为0的时候,挨着顺序接收。
int msgctl(int msgid, int command, struct msgid_ds *buf);command是将要采取的动作,它可以取3个值,
IPC_STAT:把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值。
IPC_SET:如果进程有足够的权限,就把消息列队的当前关联值设置为msgid_ds结构中给出的值
IPC_RMID:删除消息队列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值