当前位置:Linux教程 - Linux - unix中的复用消息

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 <stdio.h>
    # include <errno.h>
    # include <sys/types.h>
    # include <sys/ipc.h>
    # include <sys/msg.h>
    # 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 %d\\n\",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.6s\\n\",mymsg1.msg.com) ;
    printf(\"%12.12s\\n\",mymsg1.msg.text) ;
    return 0 ;
    }

    如有错误请指正。
    e-mail : [email protected]
    phone : 0716-6236590


    发布人:Crystal 来自:中国软件