79 lines
2.6 KiB
C++
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;
|
|
} |