1、将信号和消息队列的课堂代码敲一遍
//发送端
#include<myhead.h>//定义一个消息结构类型
struct msgbuf
{long mtype;char mtext[1024];
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入当前信息的类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}return 0;
}
//接收端
#include<myhead.h>//定义一个消息结构类型
struct msgbuf
{long mtype;char mtext[1024];
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);//2、根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}return 0;
}
2、使用消息队列完成两个进程间相互通信
//用户1
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//创建父子进程pid_t pid=fork();if(pid>0){//父进程struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入消息类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}}else if(pid==0){//子进程struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,2,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}exit(EXIT_SUCCESS);} else{perror("fork error");return -1;}return 0;
}
//用户2
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{//1、创建key值key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);//2、根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//定义父子进程pid_t pid=fork();if(pid>0){//父进程struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}exit(EXIT_SUCCESS);}else if(pid==0){//子进程struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入数据类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}}else{perror("fork error");return -1;}return 0;
}
3、思维导图