LinuxC编程使用消息队列从父进程发送10个整数到子进程,子进程收下来后计算总和,后用同一个消息队列把总和发回给父进程显示。可用整个数组的方式发送
时间: 2024-04-30 14:23:35 浏览: 38
以下是一个示例代码,其中使用了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;
}
```