1、有P1,P2,P3三个进程,P1和P2负责从键盘接收字符串,均发送给P3,P3接收到字符串,根据发送方分别显示”P3 received *** from P1(或P2)" ;用消息队列通信方式实现。
时间: 2024-05-01 15:23:20 浏览: 44
01-基于消息队列的进程间通信的设计
以下是使用消息队列实现P1、P2、P3进程之间通信的示例代码:
P1进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#define MSG_TYPE_FROM_P1 1
#define MSG_TYPE_TO_P3 2
struct message {
long type;
char data[100];
};
int main() {
int msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
struct message msg;
while (1) {
printf("P1: ");
fgets(msg.data, sizeof(msg.data), stdin);
msg.type = MSG_TYPE_TO_P3;
if (msgsnd(msgid, &msg, sizeof(msg.data), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
}
}
```
P2进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#define MSG_TYPE_FROM_P2 1
#define MSG_TYPE_TO_P3 2
struct message {
long type;
char data[100];
};
int main() {
int msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
struct message msg;
while (1) {
printf("P2: ");
fgets(msg.data, sizeof(msg.data), stdin);
msg.type = MSG_TYPE_TO_P3;
if (msgsnd(msgid, &msg, sizeof(msg.data), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
}
}
```
P3进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#define MSG_TYPE_FROM_P1 1
#define MSG_TYPE_FROM_P2 1
#define MSG_TYPE_TO_P3 2
struct message {
long type;
char data[100];
};
int main() {
int msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
struct message msg;
while (1) {
if (msgrcv(msgid, &msg, sizeof(msg.data), MSG_TYPE_TO_P3, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
if (msg.type == MSG_TYPE_TO_P3) {
if (strncmp(msg.data, "quit", 4) == 0) {
break;
}
if (msg.type == MSG_TYPE_TO_P3) {
if (msg.type == MSG_TYPE_FROM_P1) {
printf("P3 received %s from P1\n", msg.data);
} else if (msg.type == MSG_TYPE_FROM_P2) {
printf("P3 received %s from P2\n", msg.data);
}
}
}
}
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
return 0;
}
```
这里使用了三个消息队列,一个用于P1向P3发送消息,一个用于P2向P3发送消息,一个用于P3接收消息。P1、P2发送的消息类型为1,P3接收的消息类型为2。在P3接收到消息后,根据消息类型判断发送方,并进行相应输出。
阅读全文