linux设计一个程序实现以下功能: 父进程创建两个子进程,父子进程间通过消息队列实现进程通信。父进程发送10条信息,分别为message1、messsage2……message10,子进程1从消息队列上读取奇数次消息,即message1、messsage3……message9,子进程2从消息队列上读取偶数次消息,即message2、messsage4……message10。 提示:可以使用不同的type将奇偶次消息区分。
时间: 2024-02-15 09:04:33 浏览: 91
利用消息队列实现进程间通信
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define MSGKEY 1024
struct message {
long type;
char text[1024];
};
int main() {
int msgid;
struct message msg;
pid_t pid1, pid2;
int i;
// 创建消息队列
msgid = msgget(MSGKEY, IPC_CREAT | 0666);
if (msgid == -1) {
perror("msgget");
exit(1);
}
// 创建子进程1
pid1 = fork();
if (pid1 < 0) {
perror("fork");
exit(1);
} else if (pid1 == 0) { // 子进程1
for (i = 1; i <= 10; i += 2) {
if (msgrcv(msgid, &msg, sizeof(msg.text), i, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("子进程1收到消息:%s\n", msg.text);
}
exit(0);
}
// 创建子进程2
pid2 = fork();
if (pid2 < 0) {
perror("fork");
exit(1);
} else if (pid2 == 0) { // 子进程2
for (i = 2; i <= 10; i += 2) {
if (msgrcv(msgid, &msg, sizeof(msg.text), i, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("子进程2收到消息:%s\n", msg.text);
}
exit(0);
}
// 父进程发送消息
for (i = 1; i <= 10; ++i) {
msg.type = i;
sprintf(msg.text, "message%d", i);
if (msgsnd(msgid, &msg, sizeof(msg.text), 0) == -1) {
perror("msgsnd");
exit(1);
}
}
// 等待子进程退出
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
// 删除消息队列
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
```
父进程使用 `msgsnd` 发送消息,子进程1使用 `msgrcv` 接收奇数次消息,子进程2使用 `msgrcv` 接收偶数次消息,通过消息的 `type` 来区分。需要注意的是,父进程必须在创建子进程之后才能发送消息,否则子进程可能还没准备好接收消息,导致消息被丢失。
阅读全文