#include #include #include #include #include #include #include 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; }