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

/*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)

先发送后接收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值