#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:删除消息队列