Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [nsm1@korba przyklady]$ cat forki.c
- // forki.c
- /*
- zadanie 3
- Dawid Mocek
- Alina Litwiak
- Marcin Dobrowolski
- Maciej Wierzbik
- */
- #include <stdio.h>
- #include <assert.h>
- #include <time.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include "myparams.h"
- int main()
- {
- srand(time(NULL));
- int pid, i, j, k, status, kolejka, klucz, suma=0;
- mybufor bufor;
- int RND_SIZE = 200;
- int N = 4;
- int sumy[N];
- int ile[N];
- int rnd[RND_SIZE];
- /*utworzenie klucza kolejki*/
- assert ( (klucz = ftok("kolejka", 'c')) != -1);
- // procesy A:
- for (i = 0; i < N; i++)
- {
- // zeruj
- ile[i] = 0;
- sumy[i] = 0;
- // tworz prcoes
- pid = 0;
- pid = fork();
- /*uzyskanie dostepu do kolejki*/
- assert ( (kolejka = msgget (klucz, IPC_CREAT| 0600)) != -1);
- printf("|-> powolano potomka %d, PID = %d\n", i, pid);
- assert(pid != -1);
- if (pid == 0) {
- printf("|--> potomek %d\n", i);
- printf("|--> Generuje tablice\n");
- /*okreslenie typu wiadomosci*/
- bufor.typ = N + 1;
- bufor.id = i + 1;
- /*okreslenie tresci wiadomosci*/
- for(j = 0; j < ( RND_SIZE / 10 ); j++) {
- printf("|--> [id = %d][msg = %d] wstawienie wiadomosci do kolejki. bufor = { ", i + 1, j);
- for(k = 0; k < 10; k++) {
- bufor.liczby[k] = 1; //rand() % 20;
- printf("%d, ", bufor.liczby[k]);
- }
- printf(" }\n");
- /*wstawienie wiadomosci do kolejki*/
- assert ( msgsnd (kolejka, &bufor, MYBUFSIZE, 0) == 0);
- }
- /*pobieranie wiadomosci z kolejki*/
- assert ( msgrcv (kolejka, &bufor, MYBUFSIZE, i+1, 0) != -1);
- printf("[id = %d] Suma: %d\n", i + 1, bufor.liczby[0]);
- exit(0);
- }
- }
- // B
- for (i = 0; i < (N * 20); i++)
- {
- printf("|-> czekam na potomka\n");
- assert ( msgrcv (kolejka, &bufor, MYBUFSIZE, N+1, 0) != -1);
- printf("|-> recv bufor:");
- for(k=0; k < 10; k++) {
- printf(" %d, ", bufor.liczby[k]);
- }
- printf("\n");
- printf("|-> recv id = %d\n", bufor.id);
- printf("|-> recv typ = %d\n", bufor.typ);
- for(j = 0; j < 10; j++) {
- assert(bufor.liczby[j] == 1);
- sumy[bufor.id - 1] += bufor.liczby[j];
- }
- ile[bufor.id - 1]++;
- if(ile[bufor.id -1 ] == 20) {
- bufor.typ = bufor.id;
- bufor.liczby[0] = sumy[bufor.id - 1 ];
- /*wstawienie wiadomosci do kolejki*/
- assert ( msgsnd (kolejka, &bufor, MYBUFSIZE, 0) == 0);
- }
- // pid = wait(&status);
- printf("|-> PID = %d, status = %d\n", pid, status);
- }
- /*usuniecie kolejki*/
- assert ( msgctl (kolejka, IPC_RMID, NULL) == 0);
- return 0;
- }
- [nsm1@korba przyklady]$ cat myparams.h
- #define SIZE 10
- #define MYBUFSIZE ((sizeof(int) * SIZE) + sizeof(int))
- typedef struct {
- long typ;
- int id;
- int liczby[SIZE];
- } mybufor;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement