3. 编程使用消息队列从父进程发送10个整数到子进程,子进程收下来后计算总和,后用同一个消息队列把总和发回给父进程显示。可用整个数组的方式发送,或者用循环逐个元素发送。设计思路
时间: 2024-06-06 12:07:34 浏览: 76
1. 创建消息队列,获取消息队列ID。
2. 创建子进程。
3. 在父进程中,使用消息队列发送10个整数到子进程。
4. 在子进程中,使用消息队列接收10个整数,并计算它们的总和。
5. 在子进程中,使用消息队列将总和发送回父进程。
6. 在父进程中,使用消息队列接收总和,并显示结果。
7. 关闭消息队列。
相关问题
c语言编程使用消息队列从父进程发送10个整数到子进程,子进程收下来后计算总和,后用同一个消息队列把总和发回给父进程显示
父进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_KEY 1234
struct msgbuf {
long mtype;
int mtext;
};
int main() {
int i;
int sum = 0;
struct msgbuf msg;
// 创建消息队列
int msgid = msgget(MSG_KEY, IPC_CREAT | 0666);
if (msgid == -1) {
perror("msgget failed");
exit(EXIT_FAILURE);
}
// 发送消息给子进程
for (i = 1; i <= 10; i++) {
msg.mtype = 1;
msg.mtext = i;
if (msgsnd(msgid, &msg, sizeof(msg.mtext), 0) == -1) {
perror("msgsnd failed");
exit(EXIT_FAILURE);
}
}
// 接收子进程发送的消息
if (msgrcv(msgid, &msg, sizeof(msg.mtext), 2, 0) == -1) {
perror("msgrcv failed");
exit(EXIT_FAILURE);
}
sum = msg.mtext;
printf("Sum is %d\n", sum);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
子进程代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_KEY 1234
struct msgbuf {
long mtype;
int mtext;
};
int main() {
int i;
int sum = 0;
struct msgbuf msg;
// 创建消息队列
int msgid = msgget(MSG_KEY, 0666);
if (msgid == -1) {
perror("msgget failed");
exit(EXIT_FAILURE);
}
// 接收父进程发送的消息
for (i = 1; i <= 10; i++) {
if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) == -1) {
perror("msgrcv failed");
exit(EXIT_FAILURE);
}
sum += msg.mtext;
}
// 发送总和给父进程
msg.mtype = 2;
msg.mtext = sum;
if (msgsnd(msgid, &msg, sizeof(msg.mtext), 0) == -1) {
perror("msgsnd failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
LinuxC编程使用消息队列从父进程发送10个整数到子进程,子进程收下来后计算总和,后用同一个消息队列把总和发回给父进程显示。可用整个数组的方式发送
以下是一个示例代码,其中使用了System V IPC中的消息队列。
父进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_TYPE 1
struct msgbuf {
long mtype;
int mdata[10];
};
int main() {
int sum = 0;
struct msgbuf msg;
key_t key = ftok(".", 'm');
int msgid = msgget(key, IPC_CREAT | 0666);
if (msgid == -1) {
perror("msgget");
exit(1);
}
for (int i = 0; i < 10; i++) {
msg.mtype = MSG_TYPE;
msg.mdata[i] = i + 1;
if (msgsnd(msgid, &msg, sizeof(msg.mdata), 0) == -1) {
perror("msgsnd");
exit(1);
}
}
if (msgrcv(msgid, &msg, sizeof(sum), MSG_TYPE + 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
sum = msg.mdata[0];
printf("Sum is %d\n", sum);
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
```
子进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_TYPE 1
struct msgbuf {
long mtype;
int mdata[10];
};
int main() {
int sum = 0;
struct msgbuf msg;
key_t key = ftok(".", 'm');
int msgid = msgget(key, IPC_CREAT | 0666);
if (msgid == -1) {
perror("msgget");
exit(1);
}
for (int i = 0; i < 10; i++) {
if (msgrcv(msgid, &msg, sizeof(msg.mdata), MSG_TYPE, 0) == -1) {
perror("msgrcv");
exit(1);
}
sum += msg.mdata[i];
}
msg.mtype = MSG_TYPE + 1;
msg.mdata[0] = sum;
if (msgsnd(msgid, &msg, sizeof(msg.mdata), 0) == -1) {
perror("msgsnd");
exit(1);
}
return 0;
}
```
阅读全文