你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux进程间通信:消息队列

[日期:2013-01-28] 来源:Linux社区  作者:huangminqiang [字体: ]

例3:一个最简单的创建消息队列,并在同一个消息队列中通信
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>  //要加这个头文件

struct msgbuf{
 long mtype;
 char mtext[100];
}; //存放消息类型和消息内容的结构体

int main()
{
 key_t key;
 int msgid;
 struct msgbuf msg1,msg2; //msg1用来发送,msg2用来接收

 key=ftok(".", 0xf0);  //获得消息队列标识符
 if( (msgid = msgget(key, IPC_CREAT|0666)) < 0 )  //创建一个消息队列
 {
  perror("msgget error");
  exit(1);
 }
 msg1.mtype = 1;      //消息类型为1,这个可以区别多个消息
 memset(msg1.mtext,  0,  100);    //将数组清0
 strcpy(msg1.mtext, "hello");  //用strcpy给消息内容赋值
 msgsnd(msgid, &msg1, strlen(msg1.mtext)+1, 0);  //发送时最后加上一个‘\0’
 printf("send %s\n", msg1.mtext);

 msgrcv(msgid, &msg2, 100, 1, 0);    //接收1发过来的消息,存到msg2中
 printf("receive %s\n", msg2.mtext);

 msgctl(msgid, IPC_RMID,NULL);    //删除消息队列
 return 0;
}

 

例4:进程间消息队列通信
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <string.h>
#include <signal.h>

struct msgbuf{
 int mtype;
 char mtext[100];
};

int main()
{
 key_t key;
 pid_t pid;
 int msgid;
 struct msgbuf msg;

 key=ftok(".", 0x01);
 if ( (msgid = msgget(key, IPC_CREAT|0666)) <0 )
 {
  perror("msgget error");
  exit(1);
 }

 //创建一个进程
 if ( (pid = fork()) < 0 )
 {
  perror("fork error");
  exit(1);
 }
 //子进程收信息
 else if (pid==0)
 {
  while(1)
  {
  memset(msg.mtext,0,100);
  msgrcv(msgid,&msg,100,2,0);  //receive the msg from 2
  printf("\rbbb:%s\naaa:",msg.mtext);
  fflush(stdout);
  }
  exit(0);
 }
 //父进程发信息
 else
 {
  while(1)
  {
  memset(msg.mtext,0,100);
  printf("aaa:");
  fgets(msg.mtext,100,stdin);
  if (strncmp("bye",msg.mtext,3)==0)//如果前3个字符为bye,则退出
  {
    kill(pid,SIGSTOP);
    exit(1);
  }
  msg.mtype=1;//send to 1
  msg.mtext[strlen(msg.mtext)-1]='\0';
  msgsnd(msgid,&msg,strlen(msg.mtext)+1,0);
  }
 }

 return 0;
}

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款