Linux系统下-进程间通信(消息队列)

Linux系统下-进程间通信(消息队列-详解)

/*send.c*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

#define MSGKEY 123

//消息的数据结构是以一个长整型成员变量开始的结构体
struct msgstru
{
    long msgtype;
    char msgtext[2048];
};

void main()
{
    struct msgstru msgs;
    char str[256];
    int msg_type;
    int ret_value;
    int msqid;

    //检查消息队列是否存在
    msqid=msgget(MSGKEY,IPC_EXCL);//(键名,权限)
    if(msqid < 0)
    {
        //创建消息队列
        msqid = msgget(MSGKEY,IPC_CREAT|0666);
        if(msqid <0)
        {
            printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));
            exit(-1);
        }
    }

    while (1)
    {
        printf("input message type(end:0):");
        scanf("%d",&msg_type);
        if(msg_type == 0)
           break;

        printf("input message to be sent:");
        scanf ("%s",str);
        msgs.msgtype = msg_type;
        strcpy(msgs.msgtext, str);

        //发送消息队列(sizeof消息的长度,而不是整个结构体的长度)
        ret_value = msgsnd(msqid,&msgs,sizeof(msgs.msgtext),IPC_NOWAIT);
        if(ret_value < 0)
        {
            printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));
            exit(-1);
        }
    }
    //删除消息队列
    msgctl(msqid,IPC_RMID,0);
}
/*receive.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

#define MSGKEY 123

struct msgstru
{
    long msgtype;
    char msgtext[2048];
};

//子进程,监听消息队列
void childproc()
{
    struct msgstru msgs;
    int msgid,ret_value;
    char str[512];

    while(1)
    {
        //检查消息队列是否存在
        msgid = msgget(MSGKEY,IPC_EXCL);
        if(msgid < 0)
        {
            printf("msq not existed! errno=%d\n");
            sleep(2);
            continue;
        }
        //接收消息队列
        ret_value = msgrcv(msgid,&msgs,sizeof(msgs.msgtext),0,0);
        printf("text=[%s] pid=[%d]\n",msgs.msgtext,getpid());
    }
    return;
}

void main()
{
    childproc();
}

猜你喜欢

转载自blog.csdn.net/robothj/article/details/80449441