消息队列

优缺点

  1. 消息队列只适用于单台主机的进程间通信,如果是不同主机,需要用socket等其他方式,也就不属于IPC的范畴了。
  2. 消息队列可以实现异步通信,这似乎是优点,但说是它缺点也是可以的:通讯往往不是实时的。
  3. 消息队列有大小限制,通常只用于小数据量的发送。系统对用户的大小限制可以通过 ulimit -q 命令进行查询。
  4. 消息队列可以实现阻塞调用和非阻塞调用。
  5. 实现简单,且可移植性好。 

 

演示


   
   
[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <sys/msg.h>  
  5.    
  6. int main(int argc, char *argv[]){  
  7.  int ipc_key,msg_id,msg_len;  
  8.  long mtype;  
  9.  void * mbuf;  
  10.  if(argc==5 && argv[3][0]=='s'){  
  11.   ipc_key=atoi(argv[1]);  
  12.   mtype=atol(argv[2]);  
  13.   msg_len=strlen(argv[4]);  
  14.   if ( 0>(msg_id=msgget(ipc_key, 0666|IPC_CREAT)))return 1;  
  15.   if ( NULL==(mbuf=malloc(msg_len+sizeof(long)+1)) )return 2;  
  16.   memcpy(mbuf, (void *)&mtype, sizeof(long) );  
  17.   memcpy(mbuf+sizeof(long), (void *)argv[4], msg_len );  
  18.   if ( 0>msgsnd(msg_id, (struct msgbuf *)mbuf, msg_len, 0) )return 3;  
  19.   printf("Send Success.n");  
  20.  }else if(argc==4 && argv[3][0]=='r'){  
  21.   ipc_key=atoi(argv[1]);  
  22.   mtype=atol(argv[2]);  
  23.   if ( 0>(msg_id=msgget(ipc_key, 0666)))return 1;  
  24.   if ( NULL==(mbuf=malloc(4096)) )return 2;  
  25.   if ( 0>(msg_len=msgrcv(msg_id,(struct msgbuf *)mbuf, 4000, mtype, IPC_NOWAIT))){  
  26.    printf("No message received.n");  
  27.    return 3;  
  28.   }  
  29.   printf("Recv Success.(%d bytes):n",msg_len);  
  30.   printf("%sn",(char *)(mbuf+sizeof(long)));  
  31.  }else if(argc==3 && argv[2][0]=='c'){  
  32.   ipc_key=atoi(argv[1]);  
  33.   if ( 0>(msg_id=msgget(ipc_key, 0666)))return 1;  
  34.   if ( 0>msgctl(msg_id,IPC_RMID,(struct msqid_ds *)mbuf) )return 2;  
  35.  }else{  
  36.   printf("usage:"  
  37.    "%s key type s message --to send messagen"  
  38.    "%s key type r --to receiven"  
  39.    "%s key c --to clear queuen"  
  40.    ,argv[0],argv[0],argv[0]);  
  41.  }  
  42.  return 0;  
  43. }  

以上程序,实现了发数据到消息队列和从消息队列收取数据的功能。

第一个参数需要是一个整形数值,表示消息队列的Key;

第二个参数是一个长整形的数值,表示消息的Type,Key+Type 可以唯一确定一个先进先出的消息队列。

第三个参数如果是‘s’则把第四个参数发到指定消息队列,如果是‘r’则从指定消息队列收取消息,并打印。

另外,如果第二个函数是‘c’,则把Key对应的队列删除。

$ gcc -o ipc_msg ipc_msg.c $ ipcs -q


Message Queues --------

key msqid owner perms used-bytes messages

  1. 一开始队列里没有消息。

$ ./ipc_msg 1 2 s abc Send Success. $ ipcs -q


Message Queues --------

key msqid owner perms used-bytes messages 0x00000001 262144 lily 666 3 1

  1. 发送了一个消息以后,队列里有消息了,key是1,有3个字节。

$ ./ipc_msg 1 2 r Recv Success.(3 bytes): abc

  1. 从消息队列成功收到消息了。

$ ipcs -q


Message Queues --------

key msqid owner perms used-bytes messages 0x00000001 262144 lily 666 0 0

  1. 收完以后,空的消息队列仍然存在,不会自动消失。

$ ./ipc_msg 1 c

  1. 删除队列

$ ipcs -q


Message Queues --------

key msqid owner perms used-bytes messages

  1. 成功删除了,回到原始状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值