#include <stdio.h> #include <stdlib.h> #include <sys/msg.h> #include <sys/ipc.h> #include <sys/types.h> /* порожденный процесс генерирует случайные числа и пересылает их посредством очереди процессу родителю, и они оба выводят их в стандартный поток вывода */ typedef struct mymsgbuf { long mtype; int num; } mess_t; int main() { int qid; key_t msgkey; pid_t pid; mess_t buf; int length; int cont; length = sizeof(mess_t) - sizeof(long); if ((msgkey = ftok(".",'m')) < 0) { printf("Can\'t open channel\n"); return 1; } if ((qid = msgget(msgkey, IPC_CREAT | 0660)) < 0) { printf("Can\'t create queue message\n"); return 1; } if(!(pid = fork())) { printf("SON: QID = %d\n", qid); srand (time (0)); for(cont = 0; cont < 10; cont++) { sleep (rand()%4); buf.mtype = 1; buf.num = rand()%100; msgsnd(qid, &buf, length, 0); printf("SON: MESSAGE NUMBER %d: %d\n", cont+1, buf.num); } return 0; } printf("FATHER: QID = %d\n", qid); for(cont = 0; cont < 10; cont++){ sleep (rand()%4); msgrcv(qid, &buf, length, 1, 0); printf("FATHER: MESSAGE NUMBER %d: %d\n", cont+1, buf.num); } msgctl(qid, IPC_RMID, 0); return 0; } |