使用消息队列完成两个进程间相互通信
第一个进程
#include <myhead.h>
#define size sizeof(msg_ds)-sizeof(long) //正文大小
//消息结构体
typedef struct
{
long msgtype; //消息类型
char data[1024]; //消息正文
}msg_ds;
//创建子线程构造体
void *task1(void *arg)
{
//创造第二个key值
key_t key1;
if((key1=ftok("/",'f'))==-1)
{
perror("ftok error");
}
//创建第二个消息队列
int msgid1;
if((msgid1=msgget(key1,IPC_CREAT|0664))==-1)
{
perror("msgget error");
}
//4、从消息队列中取数据
msg_ds msg1;
while(1)
{
//从消息队列中取数据
//第一个0表示取消息的类型,每次都是取第一个
//第二个0表示阻塞方式从消息队列中取数据
if(msgrcv(msgid1,&msg1,size,0,0)==-1)
{
perror("msgrcv error");
}
if(strcmp(msg1.data,"quit")==0)
{
break;
}
printf("rcv: %s\n", msg1.data);
}
//删除消息队列
msgctl(msgid1,IPC_RMID,NULL);
}
int main(int argc, const char *argv[])
{
//1、创建key值
key_t key;
if((key=ftok("/",'k'))==-1)
{
perror("fotk error");
return -1;
}
//2、创造消息队列
int msgid;
if((msgid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
//3、主线程向队列中发送数据
msg_ds msg={.msgtype=100};
//定义一个线程号
pthread_t tid;
//创建一个子线程
if(pthread_create(&tid,NULL,task1,NULL))
{
printf("子线程创建失败\n");
return -1;
}
while(1)
{
//printf("请输入消息的内容:");
fgets(msg.data,sizeof(msg.data),stdin); //向终端进程中输入数据
msg.data[strlen(msg.data)-1]='\0'; //将最后一个字符'\n'变成'\0'
//将消息发到消息队列中
if(msgsnd(msgid,&msg,size,0)==-1)
{
perror("msgsnd error");
return -1;
}
//当输入quit字符串时,退出循环
if(strcmp(msg.data,"quit")==0)
{
break;
}
}
//删除消息队列
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
第二个进程
#include <myhead.h>
#define size sizeof(msg_ds)-sizeof(long) //正文大小
//消息结构体
typedef struct
{
long msgtype; //消息类型
char data[1024]; //消息正文
}msg_ds;
//创建子线程构造体
void *task1(void *arg)
{
//创造第二个key值
key_t key1;
if((key1=ftok("/",'f'))==-1)
{
perror("ftok error");
}
//创建第二个消息队列
int msgid1;
if((msgid1=msgget(key1,IPC_CREAT|0664))==-1)
{
perror("msgget error");
}
//4、从消息队列中取数据
msg_ds msg1={.msgtype=100};
//4、从消息队列中取数据
while(1)
{
//printf("请输入消息的内容:");
fgets(msg1.data,sizeof(msg1.data),stdin); //向终端进程中输入数据
msg1.data[strlen(msg1.data)-1]='\0'; //将最后一个字符'\n'变成'\0'
//将消息发到消息队列中
if(msgsnd(msgid1,&msg1,size,0)==-1)
{
perror("msgsnd error");
}
//当输入quit字符串时,退出循环
if(strcmp(msg1.data,"quit")==0)
{
break;
}
}
//删除消息队列
msgctl(msgid1,IPC_RMID,NULL);
}
int main(int argc, const char *argv[])
{
//1、创建key值
key_t key;
if((key=ftok("/",'k'))==-1)
{
perror("fotk error");
return -1;
}
//2、创造消息队列
int msgid;
if((msgid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
//3、主线程向队列中取数据
msg_ds msg={.msgtype=100};
//定义一个线程号
pthread_t tid;
//创建一个子线程
if(pthread_create(&tid,NULL,task1,NULL))
{
printf("子线程创建失败\n");
return -1;
}
while(1)
{
//从消息队列中取数据
//第一个0表示取消息的类型,每次都是取第一个
//第二个0表示阻塞方式从消息队列中取数据
if(msgrcv(msgid,&msg,size,0,0)==-1)
{
perror("msgrcv error");
return -1;
}
if(strcmp(msg.data,"quit")==0)
{
break;
}
printf("rcv: %s\n", msg.data);
}
//删除消息队列
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
思维导图