18 消息队列3

1. 举例实现无亲缘关系的进程间如何进行通信。

消息队列不像共享内存的流程,它不需要信号通知。

消息队列的另一个特点:信息读取完自动删除;可以阻塞


2. 示例一,单向通信

Write.c

#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
  long type;
  char voltage[124];
  char ID[4];
};
int main()
{
  int msgid;
  int readret;
  int key;
  struct msgbuf sendbuf,recvbuf;
  key=ftok("./b.c",'a');
  if(key < 0)
  {
	 printf("creat key failure\n");
	 return -2;
  }
  msgid=msgget(key,IPC_CREAT|0777);
  if(msgid <0)
  {
	printf("creat message queue failure\n");
	return -1;
  }
  printf("creat message queue  sucess msgid=%d\n",msgid);
  system("ipcs -q");
  sendbuf.type=100; 
  //write message queue
  while(1)
  {
   memset(sendbuf.voltage,0,124);//clear send buffer
   printf("please input message:\n");
   fgets(sendbuf.voltage,124,stdin);
   //start write message to message queue
   msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
  }
  msgctl(msgid,IPC_RMID,NULL);
  system("ipcs -q");
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/eighteen$ ./write
creat message queue  sucess msgid=65537

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x00000000 32768      alex       777        0            0
0x61016518 65537      alex       777        0            0

please input message:
hello
please input message:
hi
please input message:

Read.c

#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
  long type;
  char voltage[124];
  char ID[4];
};
int main()
{
  int msgid;
  int readret;
  int key;
  struct msgbuf sendbuf,recvbuf;
  key=ftok("./b.c",'a');
  if(key < 0)
  {
	 printf("creat key failure\n");
	 return -2;
  }
  msgid=msgget(key,IPC_CREAT|0777);
  if(msgid <0)
  {
	printf("creat message queue failure\n");
	return -1;
  }
  printf("creat message queue  sucess msgid=%d\n",msgid);
  system("ipcs -q");
 
  //read message queue
  while(1)
  {
   memset(recvbuf.voltage,0,124);//clear receive buffer
   //start read message from message queue
   msgrcv(msgid,(void *)&recvbuf,124,100,0);
   printf("receive data from message queue:%s",recvbuf.voltage);
  }
  msgctl(msgid,IPC_RMID,NULL);
  system("ipcs -q");
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/eighteen$ ./read
creat message queue  sucess msgid=65537

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x00000000 32768      alex       777        0            0
0x61016518 65537      alex       777        0            0

receive data from message queue:hello
receive data from message queue:hi


3. 示例二,双向通信,类似于聊天工具

Server.c

#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
  long type;
  char voltage[124];
  char ID[4];
};
int main()
{
  int msgid;
  int readret;
  int key;
  int pid;
  struct msgbuf sendbuf,recvbuf;
  key=ftok("./a.c",'a');
  if(key < 0)
  {
	 printf("creat key failure\n");
	 return -2;
  }
  msgid=msgget(key,IPC_CREAT|0777);
  if(msgid <0)
  {
	printf("creat message queue failure\n");
	return -1;
  }
  printf("creat message queue  sucess msgid=%d\n",msgid);
  system("ipcs -q");
  
  pid=fork();
  if(pid > 0) //parent process   write 100
  {
   sendbuf.type=100; 
   //write message queue
   while(1)
   {
    memset(sendbuf.voltage,0,124);//clear send buffer
    printf("please input message:\n");
    fgets(sendbuf.voltage,124,stdin);
    //start write message to message queue
    msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
   }
  }
  if(pid == 0)//child process read 200
  {
	while(1)
	{
	 memset(recvbuf.voltage,0,124);
	 msgrcv(msgid,(void *)&recvbuf,124,200,0);
	 printf("receive message from message queue:%s",recvbuf.voltage);
	}
  }
  msgctl(msgid,IPC_RMID,NULL);
  system("ipcs -q");
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/eighteen$ ./server
creat message queue  sucess msgid=65537

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x00000000 32768      alex       777        0            0
0x61016518 65537      alex       777        0            0

please input message:
receive message from message queue:hello
hi
please input message:
receive message from message queue:who are you
...
please input message:

Client.c

#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct msgbuf
{
  long type;
  char voltage[124];
  char ID[4];
};
int main()
{
  int msgid;
  int readret;
  int key;
  int pid;
  struct msgbuf sendbuf,recvbuf;
  key=ftok("./a.c",'a');
  if(key < 0)
  {
	 printf("creat key failure\n");
	 return -2;
  }
  msgid=msgget(key,IPC_CREAT|0777);
  if(msgid <0)
  {
	printf("creat message queue failure\n");
	return -1;
  }
  printf("creat message queue  sucess msgid=%d\n",msgid);
  system("ipcs -q");
  
  pid=fork();
  if(pid == 0) //child process   write 200
  {
   sendbuf.type=200; 
   //write message queue
   while(1)
   {
    memset(sendbuf.voltage,0,124);//clear send buffer
    printf("please input message:\n");
    fgets(sendbuf.voltage,124,stdin);
    //start write message to message queue
    msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);
   }
  }
  if(pid > 0)//parent  process read 100
  {
	while(1)
	{
	 memset(recvbuf.voltage,0,124);
	 msgrcv(msgid,(void *)&recvbuf,124,100,0);
	 printf("receive message from message queue:%s",recvbuf.voltage);
	}
  }
  msgctl(msgid,IPC_RMID,NULL);
  system("ipcs -q");
  return 0;
}

执行结果:

alex@alex-VirtualBox:~/Share/process/eighteen$ ./client
creat message queue  sucess msgid=65537

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x00000000 32768      alex       777        0            0
0x61016518 65537      alex       777        0            0

please input message:
hello
please input message:
receive message from message queue:hi
who are you
please input message:
receive message from message queue:...


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值