[Linux] 进程通信-消息队列

/*
 * =====================================================================================
 *
 *       Filename:  msq.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2013年05月03日 00时20分50秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  linkscue (scue), 
 *   Organization:  
 *
 * =====================================================================================
 */


#include    <stdio.h>
#include    <stdlib.h>
#include    <sys/types.h>
#include    <sys/msg.h>
#include    <sys/ipc.h>
#include    <unistd.h>

struct msg_buf {
    int mtype;
    char data[255];
};

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:  
 * =====================================================================================
 */
int main ( int argc, char *argv[] )
{
    key_t key;
    int msgid;
    int ret;
    
    struct msg_buf msgbuf;

    key=ftok("/tmp/msg", 'a');                  /* file to key */
    printf("key = [%x]\n",key);

    msgid=msgget(key,IPC_CREAT|0666);           /* get file key id */
    if (msgid == -1) {
        printf("create error\n");
        return -1;
    }

    msgbuf.mtype = getpid();                    /* use pid to type */
    strncpy(msgbuf.data, "test hehe", sizeof(msgbuf.data));
    printf("msgbuf.data is [%s]\n", msgbuf.data);
    ret=msgsnd(msgid, &msgbuf, sizeof(msgbuf.data), IPC_NOWAIT); /* send */
    if (ret == -1) {
        printf("send message error\n");
        return -1;
    }

    memset(&msgbuf, '\0', sizeof(msgbuf));
    ret=msgrcv(msgid, &msgbuf, sizeof(msgbuf.data), msgbuf.mtype, IPC_NOWAIT ); /* receive */
    if (ret==-1) {
        printf("receive message error \n");
        return -1;
    }

    printf("receive message is %s\n", msgbuf.data);
    return EXIT_SUCCESS;
}

 

posted @ 2013-05-03 00:48  scue  阅读(209)  评论(0编辑  收藏  举报