消息队列

1.创建消息队列
1.1函数原型:
int msgget(key_t key,int msgflg);
1.2函数功能:
获取一个消息队列的标识
1.3参数说明
key:
消息队列 关联的键值;
msgflg:
消息队列 的建立标志和存取权限。
IPC_CREAT:如果内核中没有次队列,则创建它;
IPC_EXCL当和IPC_CREAT一起使用时,如果队列已经存在,则失败
如果单独使用IPC_CREAT,则msgget()要么返回一个新创建的 消息队列 的标识符,要么返 回具有相同关键字值的队列的标识符。如果IPC_EXCL和IPC_CREAT一起使用,则msgget()要么创建一个新的 消息队列 ,要么如果队列已经存在则返回一个失败值-1。IPC_EXCL单独使用是没有用的。
1.4 头文件:
#include <sys/types.h>
#include<ipc.h>
#include<sys/msg.h>
返回值:
成功:消息队列的标示值;
失败: -1



/************************************
函数名称:
函数功能:
参    数:
作    者:
创建日期:
修改日期:
修改原因:
********************************************/

#include <stdio.h>   

#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>   
#include <sys/ipc.h>   
#include <sys/msg.h>   
#include <errno.h>   


#define MSGKEY 1024   


struct msgstru  
{  
//long msgtype;  
char msgtext[2048];  
};  


/*子进程,监听消息队列*/  
void childproc()
{  
struct msgstru msgs;  
int msgid,ret_value;  
char str[512];  
printf("Entry childproc\n");
while(1)
{  
printf("step 1\n");
msgid = msgget(MSGKEY,IPC_EXCL );/*检查消息队列是否存在 */  
printf("step 2\n");
if(msgid < 0)
{  
printf("msq not existed! errno=%d [%s]\n",errno,strerror(errno));   
continue;  
}  
printf("step 3\n");
/*接收消息队列*/  
ret_value = msgrcv(msgid,&msgs,sizeof(struct msgstru),0,0);  
printf("step 4\n");
printf("retvalue=%d \t  text=%s \t pid=%d\n",ret_value,msgs.msgtext,getpid());  
}  
return;  
}  


void main()  
{  
int i,cpid;  

/* create 5 child process */  
for (i=0;i<5;i++)
{  
cpid = fork();  
if (cpid < 0)  
printf("fork failed\n");  
else if (cpid ==0)
/*child process*/  
childproc();  
    printf("i=%d\n",i);
}  

}  


/************************************
函数名称:
函数功能:
参    数:
作    者:
创建日期:
修改日期:
修改原因:
********************************************/




#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h>   
#include <sys/ipc.h>   
#include <sys/msg.h>   
#include <errno.h>   
#define MSGKEY 1024      
struct msgstru  
{  
  // int msgtype;  
   char msgtext[2048];   
};  
 
int main()  
{  
struct msgstru msgs;  
int msg_type;  
char str[256];  
int ret_value;  
int msqid;  

msqid=msgget(MSGKEY,IPC_EXCL);  /*检查消息队列是否存在*/  
if(msqid < 0)
{  
msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/  
if(msqid <0)
{  
 printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));  
 exit(-1);  
}  
}   

while (1)
{  

       memset(&msgs,0,sizeof(msgs));
printf("input message to be sent:");  
gets(str);
//msgs.msgtype = 1;  
strcpy(msgs.msgtext, str);  
/* 发送消息队列 */  
ret_value = msgsnd(msqid,&msgs,sizeof(struct msgstru),IPC_NOWAIT);  
if ( ret_value < 0 ) 
{  
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));  
exit(-1);  
}  
}  
msgctl(msqid,IPC_RMID,0); //删除消息队列   
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值