赞
踩
简单实例,运用消息队列实现两个进程间的通信
sent.c 向get.c发送数字,从0开始。当sent.c接收到数字后进行+10处理,将处理后的数字通过消息队列发送回sent.c。sent.c接收到数字后再次发送给get.c。实现get.c对其他进程出入数据+10的作用。
用于帮助理解进程间通过消息队列通信的方法
以下是代码
sent.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
-
- #define MSG_KEY 1234
-
- typedef struct {
- long mtype;
- int data;
- } Message;
-
- int main() {
- int msgid;
- Message message;
-
- // 创建消息队列
- msgid = msgget(MSG_KEY, IPC_CREAT | 0666);
- if (msgid == -1) {
- perror("msgget");
- exit(1);
- }
- // 向 get.c 发送消息:0
- message.mtype = 1;
- message.data = 0;
- if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
- perror("msgsnd");
- exit(1);
- }
- printf("id: %d Sent: 0\n\n",msgid);
- while (1) {
- // 接收来自 get.c 发来的数字
- if (msgrcv(msgid, &message, sizeof(int), 3, 0) == -1) {
- perror("msgrcv");
- exit(1);
- }
- printf("id: %d Received: %d\n", msgid,message.data);
- // 向 get.c
- message.mtype = 1;
- if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
- perror("msgsnd");
- exit(1);
- }
- printf("id: %d Sent: %d\n\n", msgid,message.data);
- sleep(1); // 等待 1 秒后再次发送消息
- }
-
- return 0;
- }
get.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
-
- #define MSG_KEY 1234
-
- typedef struct {
- long mtype;
- int data;
- } Message;
-
- int main() {
- int msgid;
- Message message;
-
- // 创建或获取消息队列
- msgid = msgget(MSG_KEY, 0666);
- if (msgid == -1) {
- perror("msgget");
- exit(1);
- }
-
- while (1) {
- // 接收sent.c发来的数字
- if (msgrcv(msgid, &message, sizeof(int), 1, 0) == -1) {
- perror("msgrcv");
- exit(1);
- }
- printf("id: %d receiced: %d\n", msgid,message.data);
- // 加10后发送回sent.c
- message.mtype = 3;
- message.data += 10;
- if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
- perror("msgsnd");
- exit(1);
- }
- // 输出接收到的数字
- printf("id: %d sent: %d\n\n",msgid,message.data);
- }
-
- return 0;
- }
运行结果如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。