进程间通信——消息队列范例

本文通过两个C语言程序实例,详细展示了如何使用消息队列进行进程间通信,包括消息队列的创建、消息的发送与接收流程,以及关键函数如ftok、msgget、msgsnd和msgrcv的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息队列和共享内存相似,可以用于进程间通信。

1.c

#include "../common.h"
#define MSG_FILE "./1.c"
struct my_msg
{
	long int mtype;  //必须为长整型
	char mbuf[80];

};


int main()
{
	int msqid = -1;
	key_t key = -1;
	struct my_msg smsg,rmsg;
	/* 获取唯一key */
	if((key = ftok(MSG_FILE,'z'))<0)
	{
		perror("ftok");
		return -1;
	}

	printf("key: %d\n",key);

	/* 创建消息队列 */
	if ((msqid = msgget(key, IPC_CREAT|0777)) == -1)
   	{
        	 perror("msgget");
        	 return -1;
     	}


	strcpy(smsg.mbuf,"START");
	smsg.mtype = 999; // 发送的消息类型
	msgsnd(msqid, &smsg, 80, 0);

	msgrcv(msqid, &rmsg, 80, 888, 0);// 返回类型为888的第一个消息
	printf("Server: receive msg.mtext is: %s.\n", rmsg.mbuf);
	printf("Server: receive msg.mtype is: %ld.\n", rmsg.mtype);
 

	if (msgctl(msqid, IPC_RMID, 0) == -1)
    	{
        	printf("msgctl(IPC_RMID) failed\n");
    	}

}

2.c

#include "../common.h"

#define MSG_FILE "./1.c"

struct my_msg
{
	long int mtype;  //必须为长整型
	char mbuf[80];

};


int main()
{
	int msqid = -1;
	key_t key = -1;
	struct my_msg smsg,rmsg;
	/* 获取唯一key */
	if((key = ftok(MSG_FILE,'z'))<0)
	{
		perror("ftok");
		return -1;
	}

	printf("key: %d\n",key);

	/* 创建消息队列 */
	if ((msqid = msgget(key, IPC_CREAT|0777)) == -1)
   	{
        	 perror("msgget");
        	 return -1;
     	}
	

	msgrcv(msqid, &rmsg, 80, 999, 0);// 返回类型为999的第一个消息
	printf("Server: receive msg.mtext is: %s.\n", rmsg.mbuf);
	printf("Server: receive msg.mtype is: %ld.\n", rmsg.mtype);



	sprintf(smsg.mbuf,"end");
	smsg.mtype = 888; // 发送到队列的消息类型
	msgsnd(msqid, &smsg, 80, 0);


}

结果:

bekl@ubuntu:~/TEST/消息队列$ ./1
key: 2046887386
Server: receive msg.mtext is: end.
Server: receive msg.mtype is: 888.
 

bekl@ubuntu:~/TEST/消息队列$ ./2
key: 2046887386
Server: receive msg.mtext is: START.
Server: receive msg.mtype is: 999.
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值