目录
1、使用消息队列完成两个进程之间相互通信
2、共享内存实现两个进程之间的通信
3、思维导图
1、使用消息队列完成两个进程之间相互通信
//msgsnd.c
#include <myhead.h>
// 要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
// 定义一个宏,为后面需要传入数据的大小
#define SIZE sizeof(struct msgbuf) - sizeof(long)
int main(int argc, char const *argv[])
{
// 1.创建出一个key值,用于产生消息队列
key_t key = ftok("/", 'k');
if (key == -1)
{
perror("ftok error");
return -1;
}
// 2.通过生成的key创建出一个消息队列对象
int msqid = msgget(key, IPC_CREAT | 0664);
if (msqid == -1)
{
perror("msqid error");
return -1;
}
// 向消息队列中存放消息
struct msgbuf buf;
// 创建父子进程
int pid = fork();
if (pid < 0)
{
perror("fork error");
return -1;
}
else if (pid == 0)
{
// 子进程,用于读取消息队列中类型为2的数据
while (1)
{
// 读取消息队列中类型为1的数据
msgrcv(msqid, &buf, SIZE, 2, 0);
if (strcmp(buf.mtext, "quit") == 0)
{
break;
}
// 直接输出到终端,读到了什么内容
printf("\n接收到的数据为:%s\n", buf.mtext);
}
}
// 父进程
// 向消息队列中存放类型为1数据
while (1)
{
// 发送消息为1的数据
buf.mtype = 1;
printf("请输入消息内容>>>");
fgets(buf.mtext, SIZE, stdin);
buf.mtext[strlen(buf.mtext) - 1] = 0; // 将回车变成'\0'
// 将数据以阻塞的形式发送到消息队列中
msgsnd(msqid, &buf, SIZE, 0);
printf("发送成功\n");
}
wait(NULL);
return 0;
}
//msgrecv.c
#include <myhead.h>
// 要接收的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
// 定义一个宏,为后面需要传入数据的大小
#define SIZE sizeof(struct msgbuf) - sizeof(long)
int main(int argc, char const *argv[])
{
// 1.创建出一个key值,用于打开消息队列
key_t key = ftok("/", 'k');
if (key == -1)
{
perror("ftok error");
return -1;
}
// 2.打开消息队列对象
int msqid = msgget(key, IPC_CREAT | 0664);
if (msqid == -1)
{
perror("msqid error");
return -1;
}
// 向消息队列中存放消息
struct msgbuf buf;
// 创建父子进程
int pid = fork();
if (pid < 0)
{
perror("fork error");
return -1;
}
else if (pid == 0)
{
// 子进程,用于读取消息队列中类型为1的数据
while (1)
{
// 读取消息队列中类型为1的数据
msgrcv(msqid, &buf, SIZE, 1, 0);
if (strcmp(buf.mtext, "quit") == 0)
{
break;
}
// 直接输出到终端,读到了什么内容
printf("\n接收到的数据为:%s\n", buf.mtext);
}
// 删除消息队列
if (msgctl(msqid, IPC_RMID, NULL) == -1)
{
perror("msgctl error");
return -1;
}
exit(EXIT_SUCCESS);
}
// 父进程
// 向消息队列中存放类型为2数据
while (1)
{
// 向消息队列中存放类型为2的数据
buf.mtype = 2;
printf("请输入消息内容>>>");
fgets(buf.mtext, SIZE, stdin);
buf.mtext[strlen(buf.mtext) - 1] = 0; // 将回车变成'\0'
// 将数据以阻塞的形式发送到消息队列中
msgsnd(msqid, &buf, SIZE, 0);
printf("发送成功\n");
}
wait(NULL);
return 0;
}
输出结果如下:实现两个进程之间的通信
2、共享内存实现两个进程之间的通信
//shmsnd.c
#include<myhead.h>
#include<sys/user.h>
int main(int argc, char const *argv[])
{
//创建key值用于创建共享内存段
key_t key = ftok("/",'t');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %d\n",key);
//2、创建一个共享内存的对象
int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n",shmid);
//3、将共享内存段映射到程序中来
char *addr = (char *)shmat(shmid,NULL,0);
//参数1:共享内存id号
//参数2:系统自动映射对齐页
//参数3:对共享内存的操作权限为读写权限
printf("addr = %p\n",addr); //输出映射的地址
//读出共享内存中的数据
printf("消息为:%s",addr);
sleep(5);
if(shmdt(addr) == -1)
{
perror("shmdt error");
return -1;
}
//删除共享内存
if(shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("shmctl error");
return -1;
}
while(1);
return 0;
}
//shmrecv.c
#include<myhead.h>
#include<sys/user.h>
int main(int argc, char const *argv[])
{
//创建key值用于创建共享内存段
key_t key = ftok("/",'t');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %d\n",key);
//2、创建一个共享内存的对象
int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n",shmid);
//3、将共享内存段映射到程序中来
char *addr = (char *)shmat(shmid,NULL,0);
//参数1:共享内存id号
//参数2:系统自动映射对齐页
//参数3:对共享内存的操作权限为读写权限
printf("addr = %p\n",addr); //输出映射的地址
//向共享内存中写入数据
strcpy(addr,"hello a hua qing yuan jian\n");
sleep(5);
//取消映射关系
if(shmdt(addr) == -1)
{
perror("shmdt error");
return -1;
}
while(1);
return 0;
}
输出结果如下: