编程使用消息队列从父进程发送10个整数到子进程,子进程收下来后计算总和,后用同一个消息队列把总和发回给父进程显示。可用整个数组的方式发送,或者用循环逐个元素发送。
时间: 2023-05-28 14:04:25 浏览: 198
以下是使用整个数组的方式发送的代码:
父进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <unistd.h>
typedef struct {
long type;
int nums[10];
} Message;
int main() {
// 创建消息队列
int msgid = msgget(IPC_PRIVATE, 0600 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 创建子进程
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
// 子进程接收消息
Message msg;
if (msgrcv(msgid, &msg, sizeof(msg.nums), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
// 计算总和
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += msg.nums[i];
}
// 发送总和
msg.type = 2;
msg.nums[0] = sum;
if (msgsnd(msgid, &msg, sizeof(msg.nums[0]), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} else {
// 父进程发送消息
Message msg;
msg.type = 1;
for (int i = 0; i < 10; i++) {
msg.nums[i] = i + 1;
}
if (msgsnd(msgid, &msg, sizeof(msg.nums), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
// 等待子进程发送总和
if (msgrcv(msgid, &msg, sizeof(msg.nums[0]), 2, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
// 显示总和
printf("sum = %d\n", msg.nums[0]);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
}
return 0;
}
```
子进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
typedef struct {
long type;
int nums[10];
} Message;
int main() {
// 连接到父进程创建的消息队列
int msgid = msgget(IPC_PRIVATE, 0600);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 发送消息给父进程
Message msg;
if (msgrcv(msgid, &msg, sizeof(msg.nums), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
// 计算总和
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += msg.nums[i];
}
// 发送总和给父进程
msg.type = 2;
msg.nums[0] = sum;
if (msgsnd(msgid, &msg, sizeof(msg.nums[0]), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
return 0;
}
```
以下是使用循环逐个元素发送的代码:
父进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <unistd.h>
typedef struct {
long type;
int num;
} Message;
int main() {
// 创建消息队列
int msgid = msgget(IPC_PRIVATE, 0600 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 创建子进程
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
// 子进程接收消息并计算总和
int sum = 0;
for (int i = 0; i < 10; i++) {
Message msg;
if (msgrcv(msgid, &msg, sizeof(msg.num), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
sum += msg.num;
}
// 发送总和
Message msg;
msg.type = 2;
msg.num = sum;
if (msgsnd(msgid, &msg, sizeof(msg.num), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} else {
// 父进程发送消息
for (int i = 0; i < 10; i++) {
Message msg;
msg.type = 1;
msg.num = i + 1;
if (msgsnd(msgid, &msg, sizeof(msg.num), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
}
// 等待子进程发送总和
Message msg;
if (msgrcv(msgid, &msg, sizeof(msg.num), 2, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
// 显示总和
printf("sum = %d\n", msg.num);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
}
return 0;
}
```
子进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
typedef struct {
long type;
int num;
} Message;
int main() {
// 连接到父进程创建的消息队列
int msgid = msgget(IPC_PRIVATE, 0600);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 接收消息并计算总和
int sum = 0;
for (int i = 0; i < 10; i++) {
Message msg;
if (msgrcv(msgid, &msg, sizeof(msg.num), 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
sum += msg.num;
}
// 发送总和给父进程
Message msg;
msg.type = 2;
msg.num = sum;
if (msgsnd(msgid, &msg, sizeof(msg.num), 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
return 0;
}
```
阅读全文