实例:A、B、C三个终端,实现三个终端之间任意通信。要求(消息队列+父子进程) 条件:第一个:通信内容可以编辑 第二个:发送内容前几个字必须为toB,目的该消息有哪个消息接收。 第三个:当任一个进程接收到消息,必须立即显示出来消息的内容---解释:进程A输入完toC:helloipc 后,进程C在终端上显示内容:formA:helloipc
时间: 2024-04-15 19:32:05 浏览: 90
以下是一个基于消息队列和父子进程的示例程序,实现了三个终端之间的任意通信。程序分为A、B、C三个终端,每个终端都是一个独立的进程。请确保已经安装了POSIX消息队列库(`#include <mqueue.h>`)。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <mqueue.h>
#define MAX_MSG_SIZE 256
// 定义消息结构体
typedef struct {
long msg_type;
char msg_text[MAX_MSG_SIZE];
} message_t;
int main() {
// 创建消息队列
mqd_t mq;
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = 10; // 最大消息数
attr.mq_msgsize = sizeof(message_t); // 消息大小
// 打开消息队列
mq = mq_open("/my_mq", O_CREAT | O_RDWR, 0644, &attr);
if (mq == -1) {
perror("mq_open");
exit(1);
}
pid_t pid;
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) { // 子进程B
message_t rcv_msg;
while (1) {
// 接收消息
if (mq_receive(mq, (char *)&rcv_msg, sizeof(message_t), NULL) == -1) {
perror("mq_receive");
exit(1);
}
printf("from %ld: %s\n", rcv_msg.msg_type, rcv_msg.msg_text);
}
} else { // 父进程A
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) { // 子进程C
message_t rcv_msg;
while (1) {
// 接收消息
if (mq_receive(mq, (char *)&rcv_msg, sizeof(message_t), NULL) == -1) {
perror("mq_receive");
exit(1);
}
printf("from %ld: %s\n", rcv_msg.msg_type, rcv_msg.msg_text);
}
} else { // 父进程A
message_t send_msg;
while (1) {
char input[MAX_MSG_SIZE];
fgets(input, MAX_MSG_SIZE, stdin);
// 检查输入的前几个字是否为"toB"或"toC"
if (strncmp(input, "toB:", 4) == 0) {
send_msg.msg_type = 2; // 消息类型为2,发送给进程B
strcpy(send_msg.msg_text, input + 4);
// 发送消息
if (mq_send(mq, (const char *)&send_msg, sizeof(message_t), 1) == -1) {
perror("mq_send");
exit(1);
}
} else if (strncmp(input, "toC:", 4) == 0) {
send_msg.msg_type = 3; // 消息类型为3,发送给进程C
strcpy(send_msg.msg_text, input + 4);
// 发送消息
if (mq_send(mq, (const char *)&send_msg, sizeof(message_t), 1) == -1) {
perror("mq_send");
exit(1);
}
} else {
printf("Invalid input format. Please use 'toB:' or 'toC:' prefix.\n");
}
}
}
}
// 关闭和删除消息队列
mq_close(mq);
mq_unlink("/my_mq");
return 0;
}
```
这个示例程序使用了POSIX消息队列来实现进程间的通信。进程A负责接收用户输入并发送消息给进程B或进程C,进程B和进程C负责接收消息并显示在终端上。
请注意,这只是一个简单的示例程序,没有进行错误处理和完备的输入验证。在实际开发中,你可能需要添加更多的错误处理和输入验证来提高程序的健壮性。
阅读全文