Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.38 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <math.h>
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. void getNewArgv1(char**, int, char**, char*);
  9. void getNewArgv2(char**, int, char**, char*);
  10.  
  11. void generateChildren(int, char**);
  12. void synchronize(int);
  13.  
  14. int getStringLength(char*);
  15. char* fillString(char*, int);
  16.  
  17. int main(int ac, char *av[])
  18. {
  19.     if (ac != 2)
  20.         return -1;
  21.    
  22.     char* st = av[ac - 1];
  23.     int n = getStringLength(st);
  24.     st = fillString(st, n);
  25.    
  26.     char** newARGV = (char**)malloc((ac+2)*sizeof(char*));
  27.    
  28.     int i, j;
  29.     if (n > 0)
  30.     {
  31.         int p1 = fork();
  32.         if (p1 > 0)
  33.         {
  34.             int p2 = fork();
  35.             if (p2 == 0)
  36.             {
  37.                 for (j = 0; j < ac; j++)
  38.                     newARGV[j] = av[j];
  39.                
  40.                 newARGV[ac+1] = NULL;
  41.                
  42.                 char temp[100] = "";
  43.                
  44.                 for (j = 0; j < n/2; j++)
  45.                     temp[j] = st[j+n/2];
  46.                
  47.                 newARGV[ac] = temp;
  48.                
  49.                 execv("./a.out", newARGV);
  50.             }
  51.         }
  52.         else if (p1 == 0)
  53.         {
  54.             for (j = 0; j < ac; j++)
  55.                 newARGV[j] = av[j];
  56.            
  57.             newARGV[ac+1] = NULL;
  58.            
  59.             char temp[100] = "";
  60.            
  61.             for (j = 0; j < n/2; j++)
  62.                 temp[j] = st[j];
  63.            
  64.             newARGV[ac] = temp;
  65.            
  66.             execv("./a.out", newARGV);
  67.         }
  68.     }
  69.    
  70.     wait(NULL);
  71.     wait(NULL);
  72.    
  73.     printf("%d ", (int) getpid());
  74.     for (i = 1; i < ac; i++)
  75.         printf("%s ", av[i]);
  76.     printf("\n");
  77.    
  78.     free(newARGV);
  79.    
  80.     return 0;
  81. }
  82.  
  83. void getNewArgv1(char** argv1, int ac, char** av, char* s)
  84. {
  85.     int i;
  86.     for (i = 0; i < ac; i++)
  87.         argv1[i] = av[i];
  88.    
  89.     argv1[ac+1] = NULL;
  90.    
  91.     char temp[100] = "";
  92.    
  93.     for (i = 0; i < strlen(s)/2; i++)
  94.         temp[i] = s[i];
  95.    
  96.     argv1[ac] = temp;
  97. }
  98.  
  99. void getNewArgv2(char** argv2, int ac, char** av, char* s)
  100. {
  101.     int i;
  102.     for (i = 0; i < ac; i++)
  103.         argv2[i] = av[i];
  104.    
  105.     argv2[ac+1] = NULL;
  106.    
  107.     char temp[100] = "";
  108.    
  109.     for (i = 0; i < strlen(s)/2; i++)
  110.         temp[i] = s[i+strlen(s)/2];
  111.    
  112.     argv2[ac] = temp;
  113. }
  114.  
  115. void generateChildren(int ac, char** av)
  116. {
  117.     char* st = av[ac - 1];
  118.     int n = getStringLength(st);
  119.     st = fillString(st, n);
  120.    
  121.     char** newARGV = malloc((ac+2)*sizeof(char*));
  122.    
  123.     int i, j;
  124.     for (i = 0; i < n; i++)
  125.     {
  126.         int p1 = fork();
  127.         if (!p1)
  128.         {
  129.             for (j = 0; j < ac; j++)
  130.                 newARGV[j] = av[j];
  131.            
  132.             newARGV[ac+1] = NULL;
  133.            
  134.             char temp[100] = "";
  135.            
  136.             for (j = 0; j < n/2; j++)
  137.                 temp[j] = st[j];
  138.            
  139.             newARGV[ac] = temp;
  140.            
  141.             execv(av[0], newARGV);
  142.         }
  143.         else if (p1 > 0)
  144.         {
  145.             int p2 = fork();
  146.             if (!p2)
  147.             {
  148.                 for (j = 0; j < ac; j++)
  149.                     newARGV[j] = av[j];
  150.                
  151.                 newARGV[ac+1] = NULL;
  152.                
  153.                 char temp[100] = "";
  154.                
  155.                 for (j = 0; j < n/2; j++)
  156.                     temp[j] = st[j+n/2];
  157.                
  158.                 newARGV[ac] = temp;
  159.                
  160.                 execv(av[0], newARGV);
  161.             }
  162.         }
  163.     }
  164.    
  165.     synchronize(n);
  166. }
  167.  
  168. void synchronize(int n)
  169. {
  170.     int i;
  171.     for (i = 0; i < n; i++)
  172.     {
  173.         wait(NULL);
  174.         wait(NULL);
  175.     }
  176. }
  177.  
  178. int getStringLength(char* string)
  179. {
  180.     int len = strlen(string);
  181.    
  182.     double loglen = log2(len);
  183.     int nloglen = (int) loglen;
  184.    
  185.     double diff = loglen - nloglen;
  186.    
  187.     if (!diff)
  188.         return len;
  189.    
  190.     while (diff)
  191.     {
  192.         len++;
  193.        
  194.         loglen = log2(len);
  195.         nloglen = (int) loglen;
  196.        
  197.         diff = loglen - nloglen;
  198.     }
  199.    
  200.     return len;
  201. }
  202.  
  203. char* fillString(char* string, int n)
  204. {
  205.     char* temp = malloc(n);
  206.    
  207.     int i;
  208.     for (i = 0; i < strlen(string); i++)
  209.         temp[i] = string[i];
  210.    
  211.     for (i = strlen(string); i < n; i++)
  212.         temp[i] = 'x';
  213.    
  214.     return temp;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement