Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void getNewArgv1(char**, int, char**, char*);
- void getNewArgv2(char**, int, char**, char*);
- void generateChildren(int, char**);
- void synchronize(int);
- int getStringLength(char*);
- char* fillString(char*, int);
- int main(int ac, char *av[])
- {
- if (ac != 2)
- return -1;
- char* st = av[ac - 1];
- int n = getStringLength(st);
- st = fillString(st, n);
- char** newARGV = (char**)malloc((ac+2)*sizeof(char*));
- int i, j;
- if (n > 0)
- {
- int p1 = fork();
- if (p1 > 0)
- {
- int p2 = fork();
- if (p2 == 0)
- {
- for (j = 0; j < ac; j++)
- newARGV[j] = av[j];
- newARGV[ac+1] = NULL;
- char temp[100] = "";
- for (j = 0; j < n/2; j++)
- temp[j] = st[j+n/2];
- newARGV[ac] = temp;
- execv("./a.out", newARGV);
- }
- }
- else if (p1 == 0)
- {
- for (j = 0; j < ac; j++)
- newARGV[j] = av[j];
- newARGV[ac+1] = NULL;
- char temp[100] = "";
- for (j = 0; j < n/2; j++)
- temp[j] = st[j];
- newARGV[ac] = temp;
- execv("./a.out", newARGV);
- }
- }
- wait(NULL);
- wait(NULL);
- printf("%d ", (int) getpid());
- for (i = 1; i < ac; i++)
- printf("%s ", av[i]);
- printf("\n");
- free(newARGV);
- return 0;
- }
- void getNewArgv1(char** argv1, int ac, char** av, char* s)
- {
- int i;
- for (i = 0; i < ac; i++)
- argv1[i] = av[i];
- argv1[ac+1] = NULL;
- char temp[100] = "";
- for (i = 0; i < strlen(s)/2; i++)
- temp[i] = s[i];
- argv1[ac] = temp;
- }
- void getNewArgv2(char** argv2, int ac, char** av, char* s)
- {
- int i;
- for (i = 0; i < ac; i++)
- argv2[i] = av[i];
- argv2[ac+1] = NULL;
- char temp[100] = "";
- for (i = 0; i < strlen(s)/2; i++)
- temp[i] = s[i+strlen(s)/2];
- argv2[ac] = temp;
- }
- void generateChildren(int ac, char** av)
- {
- char* st = av[ac - 1];
- int n = getStringLength(st);
- st = fillString(st, n);
- char** newARGV = malloc((ac+2)*sizeof(char*));
- int i, j;
- for (i = 0; i < n; i++)
- {
- int p1 = fork();
- if (!p1)
- {
- for (j = 0; j < ac; j++)
- newARGV[j] = av[j];
- newARGV[ac+1] = NULL;
- char temp[100] = "";
- for (j = 0; j < n/2; j++)
- temp[j] = st[j];
- newARGV[ac] = temp;
- execv(av[0], newARGV);
- }
- else if (p1 > 0)
- {
- int p2 = fork();
- if (!p2)
- {
- for (j = 0; j < ac; j++)
- newARGV[j] = av[j];
- newARGV[ac+1] = NULL;
- char temp[100] = "";
- for (j = 0; j < n/2; j++)
- temp[j] = st[j+n/2];
- newARGV[ac] = temp;
- execv(av[0], newARGV);
- }
- }
- }
- synchronize(n);
- }
- void synchronize(int n)
- {
- int i;
- for (i = 0; i < n; i++)
- {
- wait(NULL);
- wait(NULL);
- }
- }
- int getStringLength(char* string)
- {
- int len = strlen(string);
- double loglen = log2(len);
- int nloglen = (int) loglen;
- double diff = loglen - nloglen;
- if (!diff)
- return len;
- while (diff)
- {
- len++;
- loglen = log2(len);
- nloglen = (int) loglen;
- diff = loglen - nloglen;
- }
- return len;
- }
- char* fillString(char* string, int n)
- {
- char* temp = malloc(n);
- int i;
- for (i = 0; i < strlen(string); i++)
- temp[i] = string[i];
- for (i = strlen(string); i < n; i++)
- temp[i] = 'x';
- return temp;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement