思维导图
小练习
使用消息队列完成两个进程间相互通信
a.c
#include <myhead.h>
typedef struct{
long msgtype; //消息类型
char data[128]; //消息正文
}Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小
int msqid;
pthread_t tid1,tid2;//写线程体
void *mywrite(void *arg){
Msg_ds msg={.msgtype=1};
while(1){
printf("请输入需要传递的消息:");
fgets(msg.data,sizeof(msg.data),stdin);
msg.data[strlen(msg.data)-1]='\0';
if(msgsnd(msqid,&msg,SIZE,0)==-1){
perror("msgsnd error");
return NULL;
}
if(!strcmp(msg.data,"quit")){
break;
}
}}
//读线程体
void *myread(void *arg){
Msg_ds msg;
while(1){
if(msgrcv(msqid,&msg,SIZE,2,0)==-1){
perror("msgrcv error");
return NULL;
}
if(!strcmp(msg.data,"quit")){
break;
}
fprintf(stderr,"\n内容为:%s\n",msg.data);
fprintf(stderr,"请输入需要传递的消息:");
}}
int main(int argc, const char *argv[])
{
//创建key值
key_t key;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}//创建消息队列
if((msqid=msgget(key,IPC_CREAT|0664))==-1){
perror("msgget error");
return -1;
}
//创建线程
if(pthread_create(&tid1,NULL,myread,NULL)){
perror("pthread create error");
return -1;
}if(pthread_create(&tid2,NULL,mywrite,NULL)){
perror("pthread create error");
return -1;
}pthread_join(tid1,NULL);
msgctl(msqid,IPC_RMID,NULL);
return 0;
}
b.c
#include <myhead.h>
typedef struct{
long msgtype; //消息类型
char data[128]; //消息正文
}Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小
int msqid;
pthread_t tid1,tid2;//写线程体
void *mywrite(void *arg){
Msg_ds msg={.msgtype=2};
while(1){
printf("请输入需要传递的消息:");
fgets(msg.data,sizeof(msg.data),stdin);
msg.data[strlen(msg.data)-1]='\0';
if(msgsnd(msqid,&msg,SIZE,0)==-1){
perror("msgsnd error");
return NULL;
}
if(!strcmp(msg.data,"quit")){
break;
}
}}
//读线程体
void *myread(void *arg){
Msg_ds msg;
while(1){
if(msgrcv(msqid,&msg,SIZE,1,0)==-1){
perror("msgrcv error");
return NULL;
}
if(!strcmp(msg.data,"quit")){
break;
}
fprintf(stderr,"\n内容为:%s\n",msg.data);
fprintf(stderr,"请输入需要传递的消息:");
}}
int main(int argc, const char *argv[])
{
//创建key值
key_t key;
if((key=ftok("/",'k'))==-1){
perror("ftok error");
return -1;
}//创建消息队列
if((msqid=msgget(key,IPC_CREAT|0664))==-1){
perror("msgget error");
return -1;
}
//创建线程
if(pthread_create(&tid1,NULL,myread,NULL)){
perror("pthread create error");
return -1;
}if(pthread_create(&tid2,NULL,mywrite,NULL)){
perror("pthread create error");
return -1;
}pthread_join(tid1,NULL);
msgctl(msqid,IPC_RMID,NULL);
return 0;
}