华清远见嵌入式学习——春节作业——2.5日
目录
作业要求:
作业答案:
作业代码效果图
作业代码截图
proc1.c
proc2.c
作业代码
proc1.c
proc2.c
作业要求:
通过消息队列实现进程之间通信代码示例
作业答案:
作业代码效果图
作业代码截图
proc1.c
proc2.c
作业代码
proc1.c
#include <myhead.h>
//定义消息队列结构体
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 <myhead.h>
//定义消息队列结构体
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;
}