您的位置:首页 > 运维架构 > Linux

Linux下进程之间通过消息队列通信小程序示例

2014-12-01 11:57 531 查看
/*commom.h*/
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <malloc.h>

#define SIZE 512
#define MAXSENDSIZE (sizeof(Message)-sizeof(long int))

typedef struct
{
long int type;
int val;
char buffer[SIZE];
}Message;

int alloc_msg(Message **msg)/*注意要用双重指针来传递动态内存*/
{
*msg = (Message *)malloc(sizeof(Message));
if (NULL == *msg)
{
perror("alloc_msg failed!\n");
exit(1);
}
memset(*msg, 0, sizeof(Message));
return 0;
}

int free_msg(Message **msg)/*注意要用双重指针来释放动态内存*/
{
free(*msg);
return 0;
}

int create_msg(key_t key)
{
int msgid;
msgid = msgget(key, 0666|IPC_CREAT);
if (msgid == -1)
{
perror("create_msg failed!\n");
exit(1);
}
return msgid;
}

int send_msg(int msgid, Message *msg)
{
if (msgsnd(msgid, (void*)msg, MAXSENDSIZE, 0)==-1)
{
perror("send_msg failed!\n");
exit(1);
}
return 0;
}

int rev_msg(int msgid, Message *msg,long int type)
{
if (msgrcv(msgid, (void *)msg, MAXSENDSIZE, type, 0)==-1)
{
perror("msg_rev failed!\n");
exit(1);
}
return 0;
}

int del_msg(int msgid)
{
if (msgctl(msgid, IPC_RMID, NULL)==-1)
{
perror("msg_del failed!\n");
exit(1);
}
return 0;
}
/*send.c*/
#include <stdio.h>
#include <stdlib.h>
#include "commom.h"

int main(void)
{
int msgid;
key_t key;
Message *msg = NULL;

alloc_msg(&msg);
key = ftok("./commom.h", 0);
msgid = create_msg(key);
msg->type = 1;
msg->val = 10;
strncpy(msg->buffer, "hello world", SIZE);
send_msg(msgid, msg);
msg->type = 2;
msg->val = 12;
strncpy(msg->buffer, "english test", SIZE);
send_msg(msgid, msg);
free_msg(&msg);
return 0;
}


/*receive.c*/
#include <stdio.h>
#include <stdlib.h>
#include "commom.h"

int main(void)
{
int msgid;
key_t key;
Message *msg = NULL;

alloc_msg(&msg);
long int type1 = 1;
long int type2 = 2;
key = ftok("./commom.h", 0);
msgid = create_msg(key);
rev_msg(msgid, msg, type1);
printf("rev_message is:type = %ld; %s, val = %d\n", msg->type, msg->buffer, msg->val);
rev_msg(msgid, msg, type2);
printf("rev_message is:type = %ld; %s, val = %d\n", msg->type, msg->buffer, msg->val);
del_msg(msgid);
free_msg(&msg);
return 0;
}


#makefile
CFLAGS = -Wall -g
CC = gcc
TARGET1 = send
TARGET2 = receive

all:$(TARGET1) $(TARGET2)
$(TARGET1):$(TARGET1).o
$(CC) $(CFLAGS) -o $@ $^
$(TARGET2):$(TARGET2).o
$(CC) $(CFLAGS) -o $@ $^
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<
clean:
rm -f *.o $(TARGET1) $(TARGET2)


先发送后接收
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息