嵌入式 IO 使用消息队列完成对结构体数据的传输&&使用信号灯集完成三个进程的同步,输出 ABCABCABCABC......

该代码示例展示了在Linux中使用消息队列进行进程间通信(IPC)。01msgsnd.c程序用于发送消息,接收用户输入的姓名和年龄,当接收到quit时停止。02msgrcv.c程序则负责接收并打印消息队列中的信息,同样在接收到quit时结束。
摘要由CSDN通过智能技术生成

1.消息队列 

 

 

 01msgsnd.c

#include <myhead.h>
#define MSGSZ (sizeof(Msginfo) - sizeof(long))
typedef struct
{
	long msgtype;
	struct
	{
		char name[16];
		char age[4];
	};
	
}Msginfo;
 
int main(int argc, const char *argv[])
{
 
	//获取key值
	key_t key;
	if ((key = ftok("/", 'm')) == -1)
	{
		perror("ftok");
	}
 
	//创建一个消息队列
	int msgid;
	if ((msgid = msgget(key, IPC_CREAT|0664)) == -1)
	{
		perror("msgget");
		return -1;
	}
 
	Msginfo msg = {.msgtype = 10};
 
	while (1)
	{
		//输入姓名年龄
		printf("请输入姓名:");
		fgets(msg.name, sizeof(msg.name), stdin);
		msg.name[strlen(msg.name) - 1] = '\0'; //换行变成结尾
		printf("请输入年龄:");
		fgets(msg.age, sizeof(msg.age), stdin);
		msg.age[strlen(msg.age) - 1] = '\0';
 
		if (msgsnd(msgid, &msg, MSGSZ, 0) == -1)
		{
			perror("msgsnd");
			return -1;
		}
 
		if (strcmp(msg.name, "quit") == 0)
		{
			break;
		}
 
 
	}
 
	msgctl(msgid, IPC_RMID, NULL);
 
 
 
	return 0;
}

 02msgrcv.c

#include <myhead.h>
#define MSGSZ (sizeof(Msginfo) - sizeof(long))
typedef struct
{
	long msgtype;
	struct
	{
		char name[16];
		char age[4];
	};
	
}Msginfo;
 
int main(int argc, const char *argv[])
{
 
	//获取key值
	key_t key;
	if ((key = ftok("/", 'm')) == -1)
	{
		perror("ftok");
	}
 
	//创建一个消息队列
	int msgid;
	if ((msgid = msgget(key, IPC_CREAT|0664)) == -1)
	{
		perror("msgget");
		return -1;
	}
 
	Msginfo msg = {.msgtype = 10};
 
	while (1)
	{
		
		if (msgrcv(msgid, &msg, MSGSZ, 0, 0) == -1)
		{
			perror("msgrcv");
			return -1;
		}
 
		printf("name = %s, age = %s\n", msg.name, msg.age);
 
 
		if (strcmp(msg.name, "quit") == 0)
		{
			break;
		}
 
 
	}
 
	return 0;
}

 2.信号灯集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值