华清远见嵌入式学习——春节作业——2.5日

目录

作业要求:

作业答案:

作业代码效果图

作业代码截图

proc1.c

proc2.c

作业代码

proc1.c

proc2.c


作业要求:

通过消息队列实现进程之间通信代码示例

作业答案:

作业代码效果图

华清远见嵌入式学习——春节作业——2.5日_第1张图片

作业代码截图

proc1.c

华清远见嵌入式学习——春节作业——2.5日_第2张图片

proc2.c

华清远见嵌入式学习——春节作业——2.5日_第3张图片

作业代码

proc1.c

#include 

//定义消息队列结构体
struct msg
{
	long int type;
	char text[64];
};

//宏定义消息正文的大小
#define MSGSIZE sizeof(struct msg)-sizeof(long int)

int main(int argc, const char *argv[])
{
	//定义消息队列变量
	key_t key = ftok("/",'s');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}

	//定义进程号
	pid_t pid;
		
	//定义消息队列id号
	int msqid;	

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

	//创建子进程
	pid = fork();	

	//判断子进程是否创建成功
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程实现对消息队列1的读取
		
		//定义消息队列结构体变量并初始化消息队列的类型为1
		struct msg buf = {.type = 1};
			
		//循环赋值并写入消息队列
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从消息队列1中读取数据
			if(msgrcv(msqid,&buf,MSGSIZE,1,0) == -1)
			{
				perror("msgrcv error");
				return -1;
			}
			
			//输出读取到的数据
			printf("读取的数据为:%s\n",buf.text);
			
	
			//设定循环退出条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}

		}
		
		//退出子进程
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程实现对消息队列2的写入
		
		//定义消息队列结构体变量并初始化消息队列的类型为2
		struct msg buf = {.type = 2};
		
		//循环向消息队列2中写入数据
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从终端输入内容向数组中赋值
			fgets(buf.text,sizeof(buf.text),stdin);
		
			//将数组最后一位值('\n')用'\0'替换
			buf.text[strlen(buf.text)-1] = '\0';

			//将数组中的数据写入消息队列2
			if(msgsnd(msqid,&buf,MSGSIZE,0) == -1)
			{
				perror("msgsnd error");
				return -1;
			}

			//设定退出循环的条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}		
		}
		
		//回收子进程资源
		wait(NULL);
	}
	return 0;
}

proc2.c

#include 

//定义消息队列结构体
struct msg
{
	long int type;
	char text[64];
};

//宏定义消息正文的大小
#define MSGSIZE sizeof(struct msg)-sizeof(long int)

int main(int argc, const char *argv[])
{
	//定义消息队列变量
	key_t key = ftok("/",'s');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}

	//定义进程号
	pid_t pid;
		
	//定义消息队列id号
	int msqid;	

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

	//创建子进程
	pid = fork();	

	//判断子进程是否创建成功
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程实现对消息队列1的写入
		
		//定义消息队列结构体变量并初始化消息队列的类型为1
		struct msg buf = {.type = 1};
			
		//循环赋值并写入消息队列1
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从终端输入内容向数组中赋值
			fgets(buf.text,sizeof(buf.text),stdin);
		
			//将数组最后一位值('\n')用'\0'替换
			buf.text[strlen(buf.text)-1] = '\0';

			//将数组中的数据写入消息队列1
			if(msgsnd(msqid,&buf,MSGSIZE,0) == -1)
			{
				perror("msgsnd error");
				return -1;
			}

			//设定退出循环的条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}		
		}
		
		//退出子进程
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程实现对消息队列2的读取
		
		//定义消息队列结构体变量并初始化消息队列的类型为2
		struct msg buf = {.type = 2};
		
		//循环从消息队列2中读取数据
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从消息队列2中读取数据
			if(msgrcv(msqid,&buf,MSGSIZE,2,0) == -1)
			{
				perror("msgrcv error");
				return -1;
			}
			
			//输出读取到的数据
			printf("读取的数据为:%s\n",buf.text);
			
	
			//设定循环退出条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}
		}
		
		//回收子进程资源
		wait(NULL);
	}
	//删除消息队列
	if(msgctl(msqid, IPC_RMID, NULL) == -1)
	{
		perror("msgctl error");
		return -1;
	}


	return 0;
}

你可能感兴趣的:(学习)