欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 进程:消息队列

进程:消息队列

2024/10/23 23:33:24 来源:https://blog.csdn.net/m0_71556251/article/details/143128914  浏览:    关键词:进程:消息队列

使用消息队列实现两个进程的相互通信

进程1:

#include <myhead.h>
//定义消息结构体
typedef struct
{long mtype; 	//消息类型char mtext[1024]; 	//消息正文
}msgbuf;#define MSGSZ (sizeof(msgbuf) - sizeof(long))int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("./",'0');if(key == -1){perror("ftok error");return -1;}//创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if( msgid == -1 ){perror("msgget error");return -1;}//创建2个进程pid_t pid = fork();msgbuf sbuf,rbuf;//当前进程用于发送消息if(pid > 0){while(1){//printf("发送消息的类型>>>");//scanf("%ld",&sbuf.mtype);//getchar(); 							//吸收回车sbuf.mtype = 1; 						//本进程发送消息的类型为1//printf("%ld\n",sbuf.mtype);//printf("发送消息的正文>>>");fgets(sbuf.mtext , MSGSZ , stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = '\0'; 	//将回车置为0msgsnd(msgid , &sbuf ,MSGSZ , 0); 	//发送消息的正文//printf("发送成功\n");if( strcmp(sbuf.mtext,"quit") == 0 ) 	//结束循环{break;}}}//子进程用于接收消息else if(pid == 0){while(1){rbuf.mtype = 2; 						//本进程接收消息的类型msgrcv(msgid , &rbuf , MSGSZ , rbuf.mtype ,0); 	//接收信息printf("张三:%s\n",rbuf.mtext);if(strcmp(rbuf.mtext,"quit") == 0) 	//结束循环{break;}}//删除消息队列if( msgctl(msgid,IPC_RMID,NULL) == -1){perror("msgctl error");return -1;}exit(EXIT_SUCCESS); 	//退出进程}else{perror("fork error");return -1;}wait(NULL); 	//回收子进程资源	return 0;
}

进程2:

#include <myhead.h>
//定义消息结构体
typedef struct
{long mtype; 	//消息类型char mtext[1024]; 	//消息正文
}msgbuf;#define MSGSZ (sizeof(msgbuf) - sizeof(long))int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("./",'0');if(key == -1){perror("ftok error");return -1;}//创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if( msgid == -1 ){perror("msgget error");return -1;}//创建2个进程pid_t pid = fork();msgbuf sbuf,rbuf;//当前进程用于发送消息if(pid > 0){while(1){//printf("发送消息的类型>>>");//scanf("%ld",&sbuf.mtype);//getchar(); 							//吸收回车sbuf.mtype = 2; 						//本进程发送的消息类型//printf("%ld\n",sbuf.mtype);//printf("发送消息的正文>>>");fgets(sbuf.mtext , MSGSZ , stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = '\0'; 	//将回车置为0msgsnd(msgid , &sbuf ,MSGSZ , 0); 	//发送消息的正文//printf("发送成功\n");if( strcmp(sbuf.mtext,"quit") == 0 ) 	//结束循环{break;}}}//子进程用于接收消息else if(pid == 0){while(1){rbuf.mtype = 1;msgrcv(msgid , &rbuf , MSGSZ , rbuf.mtype ,0); 	//接收信息printf("李四:%s\n",rbuf.mtext);if(strcmp(rbuf.mtext,"quit") == 0) 	//结束循环{break;}}exit(EXIT_SUCCESS); 	//退出进程}else{perror("fork error");return -1;}wait(NULL); 	//回收进程资源return 0;
}

思维导图:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com