Advertisement
Bkmz

Untitled

Apr 19th, 2012
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. #include <sys/resource.h>
  6. #include <linux/types.h>
  7.  
  8. #include <sys/wait.h>
  9.  
  10. #define NAME "ANOVIKOV-LAB3.1"
  11.  
  12. #define START_MEM 1024
  13. #define MAX 100
  14. #define THREADS 8
  15.  
  16. unsigned int a=0,b=0,c=0,d=0;
  17. unsigned int K;
  18.  
  19. pid_t *pids;
  20.  
  21. struct equation {
  22.     unsigned int a;
  23.     unsigned int b;
  24.     unsigned int c;
  25.     unsigned int d;
  26. };
  27.  
  28. struct equation **result;
  29.  
  30. typedef unsigned long long uint64;
  31.  
  32. // for prevent segmentation fault
  33. uint64 result_mem[THREADS];
  34.  
  35. void print_data(unsigned int a, unsigned int b,
  36.                 unsigned int c, unsigned int d,
  37.                 int type)
  38. {
  39.  
  40.     printf("%i %i %i %i", a,b,c,d);
  41.     if (type == 0)
  42.     {
  43.         printf(" a+b+c+d = %i", K);
  44.     }else if(type == 1)
  45.     {
  46.         printf(" a-b+c-d = %i", K);
  47.     }else if(type == 2)
  48.     {
  49.         printf(" a*b-c*d = %i", K);
  50.     }
  51.     printf("\n");
  52.  
  53. }
  54.  
  55.  
  56. struct equation make_equation(unsigned int a, unsigned int b,
  57.                                      unsigned int c, unsigned int d)
  58. {
  59.     struct equation out = {a,b,c,d};
  60.     return out;
  61. }
  62.  
  63. int main(void)
  64. {
  65.     int i;
  66.     int index;
  67.  
  68.     int STEP = THREADS;
  69.     K=1024;
  70.     setbuf(stdout, NULL);
  71.  
  72.     pids = (pid_t*)malloc(sizeof(pid_t) * THREADS);
  73.  
  74.     result = (struct equation**)malloc(sizeof(struct equation *)*THREADS);
  75.  
  76.     for (i=0;i<THREADS;i++)
  77.     {
  78.         result[i] = (struct equation*)malloc(sizeof(struct equation) * START_MEM);
  79.         result_mem[i] = START_MEM;
  80.     }
  81.  
  82.     for(index=0;index<THREADS;index++)
  83.     {
  84.         pid_t p = fork();
  85.         pids[index] = p;
  86.  
  87.         // variable for current array state
  88.         uint64 arr_i=0;
  89.  
  90.         switch (p){
  91.             case 0: // child
  92.             {
  93.             STEP = THREADS;
  94.                 for(a=0;a<MAX;a++)
  95.                 {
  96.                     for(b=0;b<MAX;b++)
  97.                     {
  98.                         for(c=0;c<MAX;c++)
  99.                         {
  100.                             for(d=index;d<MAX;d+=STEP)
  101.                             {
  102.  
  103. //                                printf("%i %i %i %i\n", a,b,c,d);
  104.  
  105.                                 if (a+b+c+d == K)
  106.                                 {
  107.                                     if (result_mem[index] <= arr_i )
  108.                                     {
  109.                                         result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
  110.                                         result_mem[index] *= 2;
  111.                                         printf("pid: %i; mem: %lli\n", index, result_mem[index]);
  112.                                         printf("\t%i %i %i %i\n", a,b,c,d);
  113.  
  114.                                     }
  115.                                     result[index][arr_i++] = make_equation(a,b,c,d);
  116.                                     print_data(a,b,c,d,0);
  117.                                 }
  118.  
  119.                                 if (a-b+c-d == K)
  120.                                 {
  121.                                     if (result_mem[index] <= arr_i )
  122.                                     {
  123.                                         result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
  124.                                         result_mem[index] *= 2;
  125.                                         printf("pid: %i; mem: %lli\n", index, result_mem[index]);
  126.                                         printf("\t%i %i %i %i\n", a,b,c,d);
  127.  
  128.                                     }
  129.                                     result[index][arr_i++] = make_equation(a,b,c,d);
  130.                                     print_data(a,b,c,d,1);
  131.                                 }
  132.  
  133.                                 if (a*b-c*d == K)
  134.                                 {
  135.                                     if (result_mem[index] <= arr_i )
  136.                                     {
  137.                                         result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
  138.                                         result_mem[index] *= 2;
  139.                                         printf("pid: %i; mem: %lli\n", index, result_mem[index]);
  140.                                         printf("\t%i %i %i %i\n", a,b,c,d);
  141.  
  142.                                     }
  143.                                     result[index][arr_i++] = make_equation(a,b,c,d);
  144.                                     print_data(a,b,c,d,2);
  145.                                 }
  146.                             }
  147.                         }
  148.                     }
  149.                 }
  150.  
  151.  
  152.                 return 0; //similar to _exit(0)
  153.             }
  154.             default: //parent
  155.             {
  156.  
  157.  
  158.             }
  159.         }
  160.     }
  161.  
  162.  
  163.  
  164.     wait(NULL);
  165.  
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement