ITPub博客

首页 > Linux操作系统 > Linux操作系统 > UNIX中的消息 (转)

UNIX中的消息 (转)

原创 Linux操作系统 作者:worldblog 时间:2007-12-03 11:31:10 0 删除 编辑
UNIX中的消息 (转)[@more@]

      unix中的复用消息
 
  System V中的IPC技术是指进程间相互通讯技术。消息队列使用消息队列标识符标识,具有足够权限的任何进程都可以往一个给定消息队列放置消息,并且也可以从队列中读出消息。与一个队列中的每个消息相关联的类型字段可用于标识消息,从而允许多个进程在单个队列上复用消息。
  考虑我行储蓄通存通兑的实现过程,模拟一个服务器进程带多个客户。具体实现过程如下 :
1 .定义一个消息结构:
  typedef struct {
  int pid ;  // 客户进程id
  char  com[6] ;  //  储蓄所所号
  char text[256] ;  //  传输信息
  }Msg ;
  struct tagMsg {
  long mtype ;  // 消息标识符
  Msg msg ; 
  }mymsg ;
2 . 客户向服务器发送mtype = 1的请求,并且让mymsg.msg.pid等于客户进程id,
3 . 服务器处理请求后向消息队列发送消息,并且让mtype 等于客户进程id。
4 . 客户从消息队列读出mtype等于客户进程id的消息。

具体实现过程如下:
//  Msg.h
# include
# include
# include
# include
# include
# define  KEY 23456L
typedef struct {
  int pid ;
  char  com[6] ;
  char text[256] ;
  }Msg ;

// Server.c
file://------------------------
// Date : 2000.12.27
file://------------------------
# include "Msg.h"
int
main(void)
{
  struct tagMsg {
  long mtype ;
  Msg msg ;
  }mymsg ;
  int msgpid ;
  int size,n ;
  long lcom
 
  if((msgpid = msgget(KEY,IPC_CREAT|0x666)) < 0)
  {
  perror("Msgget :") ;
  exit(0) ;
  }
  size = sizeof(struct tagMsg) ;
  memset(&mymsg,0,sizeof(struct tagMsg)) ;

  for (;;) { 
  if((n = msgrcv(msgpid,&mymsg,size,1,0)) < 0)
  {
  perror("Msgrcv :") ;
  exit(0) ;
  } 
  printf("%6.6s  %dn",mymsg.msg.com,mymsg.mtype) ;
  lcom = atol(mymsg.msg.com) ;
  mymsg.mtype = mymsg.msg.pid ;
  switch (lcom) { 
  case  111111 :
  memcpy(mymsg.msg.text,"qqQQQQ",6) ; 
  memcpy(mymsg.msg.com,"999999",6) ;
  break ;
  case  222222 :
  memcpy(mymsg.msg.text,"UUUUUU",6) ;
  memcpy(mymsg.msg.com,"999999",6) ;
  break ;
  case  333333 :
  memcpy(mymsg.msg.text,"ZZZZZZ",6) ;
  memcpy(mymsg.msg.com,"999999",6) ;
  break ;
  default :
  break ;
  } 
  if(( n = msgsnd(msgpid,&mymsg,size,0)) < 0 )
  {
  perror("""Msgsnd :") ;
  exit(0) ;
  }
  }
  return 0 ;
}

// Client.c
file://------------------------
// Date : 2000.12.27
file://------------------------
# include "Msg.h"
int
main(int argc,char **argv)
{
  struct tagMsg {
  long mtype ;
  Msg msg ;
  }mymsg,mymsg1 ;
  int msgpid ;
  int size,n ;
 
  if((msgpid = msgget(KEY,IPC_ALLOC)) < 0)
  {
  perror("Msgget :") ;
  exit(0) ;
  }
  mymsg.mtype = 1 ;
  mymsg.msg.pid = getpid() ;
  memcpy(mymsg.msg.com,argv[1],6) ;
  size = sizeof(struct tagMsg) ;
 
  if((n = msgsnd(msgpid,&mymsg,size,0)) < 0 )
  {
  perror("Msgsnd :") ;
  exit(0) ;
  } 
  memset(&mymsg1,0,sizeof(struct tagMsg)) ;
  sleep(1) ;

  if((n = msgrcv(msgpid,&mymsg1,size,getpid(),0)) < 0)
  {
  perror("Msgrcv :") ;
  exit(0) ;
  } 
  printf("%6.6sn",mymsg1.msg.com) ; 
  printf("%12.12sn",mymsg1.msg.text) ;
  return 0 ;
}

如有错误请指正。
 E-Mail : yahoo.com.cn">crystal_zsp@yahoo.com.cn
 Phone : 0716-6236590
 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-987657/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2410544