18 消息队列3

来源:互联网 发布:大数据市场调研 编辑:程序博客网 时间:2024/05/27 01:37

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$ ./writecreat message queue  sucess msgid=65537------ Message Queues --------key        msqid      owner      perms      used-bytes   messages0x00000000 32768      alex       777        0            00x61016518 65537      alex       777        0            0please input message:helloplease input message:hiplease 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$ ./readcreat message queue  sucess msgid=65537------ Message Queues --------key        msqid      owner      perms      used-bytes   messages0x00000000 32768      alex       777        0            00x61016518 65537      alex       777        0            0receive data from message queue:helloreceive 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$ ./servercreat message queue  sucess msgid=65537------ Message Queues --------key        msqid      owner      perms      used-bytes   messages0x00000000 32768      alex       777        0            00x61016518 65537      alex       777        0            0please input message:receive message from message queue:hellohiplease 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$ ./clientcreat message queue  sucess msgid=65537------ Message Queues --------key        msqid      owner      perms      used-bytes   messages0x00000000 32768      alex       777        0            00x61016518 65537      alex       777        0            0please input message:helloplease input message:receive message from message queue:hiwho are youplease input message:receive message from message queue:...

0 0
原创粉丝点击