Files
2026-06-25 00:09:09 +08:00

79 lines
2.6 KiB
C++

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
struct MsgStruct {
long mtype;
char mtext[1024];
};
int main() {
key_t key = ftok("/tmp", 'a');
int msgid = msgget(key, IPC_CREAT | 0666);
if (fork() == 0) {
char a[64][64];
for (int i = 0; i < 64; i++)
for (int j = 0; j < 64; j++)
a[i][j] = i < 32 ? (j < 32 ? 'a' : 'b') : (j < 32 ? 'c' : 'd');
struct MsgStruct mgb;
mgb.mtype = 1;
int k = 0;
for (int i = 0; i < 32; i++) for (int j = 0; j < 32; j++) mgb.mtext[k++] = a[i][j];
msgsnd(msgid, &mgb, sizeof(mgb), 0);
k = 0;
for (int i = 0; i < 32; i++) for (int j = 32; j < 64; j++) mgb.mtext[k++] = a[i][j];
msgsnd(msgid, &mgb, sizeof(mgb), 0);
k = 0;
for (int i = 32; i < 64; i++) for (int j = 0; j < 32; j++) mgb.mtext[k++] = a[i][j];
msgsnd(msgid, &mgb, sizeof(mgb), 0);
k = 0;
for (int i = 32; i < 64; i++) for (int j = 32; j < 64; j++) mgb.mtext[k++] = a[i][j];
msgsnd(msgid, &mgb, sizeof(mgb), 0);
exit(1);
}
if (fork() == 0) {
struct MsgStruct mgb;
mgb.mtype = 2;
strcpy(mgb.mtext, "ijkl");
msgsnd(msgid, &mgb, sizeof(mgb), 0);
strcpy(mgb.mtext, "mnop");
msgsnd(msgid, &mgb, sizeof(mgb), 0);
exit(2);
}
if (fork() == 0) {
char a[64][64];
struct MsgStruct mgb;
msgrcv(msgid, &mgb, sizeof(mgb), 1, 0);
int k = 0;
for (int i = 0; i < 32; i++) for (int j = 0; j < 32; j++) a[i][j] = mgb.mtext[k++];
msgrcv(msgid, &mgb, sizeof(mgb), 1, 0);
k = 0;
for (int i = 0; i < 32; i++) for (int j = 32; j < 64; j++) a[i][j] = mgb.mtext[k++];
msgrcv(msgid, &mgb, sizeof(mgb), 1, 0);
k = 0;
for (int i = 32; i < 64; i++) for (int j = 0; j < 32; j++) a[i][j] = mgb.mtext[k++];
msgrcv(msgid, &mgb, sizeof(mgb), 1, 0);
k = 0;
for (int i = 32; i < 64; i++) for (int j = 32; j < 64; j++) a[i][j] = mgb.mtext[k++];
for (int i = 0; i < 64; i++) {
for (int j = 0; j < 64; j++) printf("%c", a[i][j]);
printf("\n");
}
exit(3);
}
if (fork() == 0) {
struct MsgStruct mgb;
msgrcv(msgid, &mgb, sizeof(mgb), 2, 0);
printf("p4 received %s\n", mgb.mtext);
msgrcv(msgid, &mgb, sizeof(mgb), 2, 0);
printf("p4 received %s\n", mgb.mtext);
exit(4);
}
wait(NULL);
msgctl(msgid, IPC_RMID, NULL);
return 0;
}