一、使用消息队列完成俩个进程通信
snd.c
#include <myhead.h>
struct msgbuf
{
long type;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, char const *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//通过key值创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("msqid = %d\n",msqid);
//向消息队列中存放消息
struct msgbuf buf;
while(1)
{
printf("请输入消息类型\n");
scanf("%ld",&buf.mtype);
getchar(); //吸收回车
printf("请输入消息正文:");
fgets(buf.mtext,SIZE,stdin); //从终端获取数据
buf.mtext[strlen(buf.mtext)-1]=0; //将换行转换成'\0'
//将消息发送到队列中
msgsnd(msqid,&buf,SIZE,0);
//参数1:消息队列id号
//参数2:消息队列起始地址
//参数3:消息正文大小
//参数4:阻塞形式发送数据
printf("发送成功\n");
if(strcmp(msqid,"quid")==-1)
{
break;
}
}
return 0;
}
rcb.c
#include <myhead.h>
struct msgbuf
{
long type;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, char const *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//通过key值创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("msqid = %d\n",msqid);
//向消息队列中存放消息
struct msgbuf buf;
while(1)
{
msgrcv(msqid,&buf,SIZE,0,0);
//参数1:消息队列id号
//参数2:数据容器起始地址
//参数3:数据的正文大小
//参数4:消息类型,0表示任意类型
//参数5:表示阻塞读取消息
printf("收到的消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid,IPC_RMID,NULL)==-1)
{
perror("msgtcl error");
return -1;
}
return 0;
}
二、使用共享内存完成俩个进程通信
snd.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//创建一个共享内存的对象
int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid=%d\n",shmid);
//将共享内存段映射到程序中来
char *addr=(char *)shmat(shmid,NULL,0);
//参数1:共享内存的id号
//参数2:对齐页地址,一般填NULL
//参数3:共享内存的权限为读写
printf("addr=%p\n",addr); //输出映射地址
//向共享内存里写入数据
strcpy(addr,"hello a\n");
sleep(5); //休眠五秒
//取消映射关系
if(shmdt(addr)==-1)
{
perror("shmdt error");
return -1;
}
while(1);
return 0;
}
rcv.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//创建一个共享内存的对象
int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid=%d\n",shmid);
//将共享内存段映射到程序中来
char *addr=(char *)shmat(shmid,NULL,0);
//参数1:共享内存的id号
//参数2:对齐页地址,一般填NULL
//参数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;
}
三、思维导图