Advertisement
m4ly

[OR] Zadanie 3

Dec 13th, 2015
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.93 KB | None | 0 0
  1. [nsm1@korba przyklady]$ cat forki.c
  2. // forki.c
  3.  
  4. /*
  5. zadanie 3
  6.  
  7. Dawid Mocek
  8. Alina Litwiak
  9. Marcin Dobrowolski
  10. Maciej Wierzbik
  11.  
  12. */
  13. #include <stdio.h>
  14. #include <assert.h>
  15. #include <time.h>
  16. #include <sys/types.h>
  17. #include <sys/ipc.h>
  18. #include <sys/msg.h>
  19.  
  20. #include "myparams.h"
  21.  
  22.  
  23. int main()
  24. {
  25.   srand(time(NULL));
  26.   int pid, i, j, k, status, kolejka, klucz, suma=0;
  27.   mybufor bufor;
  28.   int RND_SIZE = 200;
  29.   int N = 4;
  30.   int sumy[N];
  31.   int ile[N];
  32.   int rnd[RND_SIZE];
  33.  
  34.  
  35.  
  36.   /*utworzenie klucza kolejki*/
  37.  assert ( (klucz = ftok("kolejka", 'c')) != -1);
  38.  
  39. // procesy A:
  40.   for (i = 0; i < N; i++)
  41.   {
  42.    // zeruj
  43.     ile[i] = 0;
  44.     sumy[i] = 0;
  45.  
  46.     // tworz prcoes
  47.     pid = 0;
  48.     pid = fork();
  49.  
  50.     /*uzyskanie dostepu do kolejki*/
  51.      assert ( (kolejka = msgget (klucz, IPC_CREAT| 0600)) != -1);
  52.     printf("|-> powolano potomka %d, PID = %d\n", i, pid);
  53.  
  54.     assert(pid != -1);
  55.     if (pid == 0) {
  56.  
  57.         printf("|--> potomek %d\n", i);
  58.         printf("|--> Generuje tablice\n");
  59.  
  60.         /*okreslenie typu wiadomosci*/
  61.         bufor.typ = N + 1;
  62.         bufor.id = i + 1;
  63.  
  64.        /*okreslenie tresci wiadomosci*/
  65.        for(j = 0; j < ( RND_SIZE / 10 ); j++) {
  66.        printf("|--> [id = %d][msg = %d]  wstawienie wiadomosci do kolejki. bufor = { ", i + 1, j);
  67.           for(k = 0; k < 10; k++) {
  68.             bufor.liczby[k] = 1; //rand() % 20;
  69.             printf("%d, ", bufor.liczby[k]);
  70.         }
  71.         printf(" }\n");
  72.  
  73.  
  74.         /*wstawienie wiadomosci do kolejki*/
  75.         assert ( msgsnd (kolejka, &bufor, MYBUFSIZE, 0) == 0);
  76.        }
  77.  
  78.        /*pobieranie wiadomosci z kolejki*/
  79.         assert ( msgrcv (kolejka, &bufor, MYBUFSIZE, i+1, 0) != -1);
  80.         printf("[id = %d] Suma: %d\n", i + 1, bufor.liczby[0]);
  81.         exit(0);
  82.     }
  83.   }
  84.  
  85. // B
  86.   for (i = 0; i < (N * 20); i++)
  87.   {
  88.      printf("|-> czekam na potomka\n");
  89.      assert ( msgrcv (kolejka, &bufor, MYBUFSIZE, N+1, 0) != -1);
  90.  
  91.     printf("|->  recv bufor:");
  92.     for(k=0; k < 10; k++) {
  93.         printf(" %d, ", bufor.liczby[k]);
  94.     }
  95.  
  96.      printf("\n");
  97.      printf("|-> recv id = %d\n", bufor.id);
  98.      printf("|-> recv typ = %d\n", bufor.typ);
  99.  
  100.      for(j = 0; j < 10; j++) {
  101.  
  102.  
  103.         assert(bufor.liczby[j] == 1);
  104.         sumy[bufor.id - 1] += bufor.liczby[j];
  105.      }
  106.  
  107.      ile[bufor.id - 1]++;
  108.  
  109.      if(ile[bufor.id -1 ] == 20) {
  110.         bufor.typ = bufor.id;
  111.         bufor.liczby[0] = sumy[bufor.id - 1 ];
  112.  
  113.         /*wstawienie wiadomosci do kolejki*/
  114.         assert ( msgsnd (kolejka, &bufor, MYBUFSIZE, 0) == 0);
  115.      }
  116.  
  117. //     pid = wait(&status);
  118.      printf("|-> PID = %d, status = %d\n", pid, status);
  119.   }
  120.       /*usuniecie kolejki*/
  121.         assert ( msgctl (kolejka, IPC_RMID, NULL) == 0);
  122.  
  123.   return 0;
  124. }
  125. [nsm1@korba przyklady]$ cat myparams.h
  126. #define SIZE 10
  127. #define MYBUFSIZE ((sizeof(int) * SIZE) + sizeof(int))
  128.  
  129. typedef struct {
  130.   long typ;
  131.   int id;
  132.   int liczby[SIZE];
  133. } mybufor;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement