Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SO2 IS1 220A LAB03
- // Olga Chróstowska
- #include <stdlib.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/wait.h>
- int main(int argc, char **argv)
- {
- int status = 0;
- pid_t child_pid1, child_pid2, pid;
- char argsLine[1024];
- if(argc <= 1)
- {
- printf("Nakarm program argumencikiem, bo nie zadziała! :)");
- exit(0);
- }
- if(argv[2] == NULL)
- {
- argv[2] = "";
- }
- // sprawdzam dlugosc argumentu wywolania
- int argLength = strlen(argv[1]);
- // alokuje sobie pamiec na skroconego stringa lub jego kopie
- char *argument = malloc( sizeof(char) * ( argLength + 1 ));
- // jelsi mam nieparzysta ilosc znakow i nie jest to pojedyncza litera, bede chciala go uciac, wiec zmniejszam dluzgos
- if((argLength % 2) == 1 && argLength>1) {
- argLength = argLength-1;
- }
- // kopiuje argv[1] do argument ewentualnie obcinajac ostatni znak
- strncpy(argument, argv[1], argLength);
- // zapisuje do argsline dotychczasowy argsline - lancuch wywolan i dolaczam ostatni przekazany argument
- sprintf(argsLine, "%s %s", argv[2], argv[1]);
- //
- char *argvList[] = {argv[0], argument, argsLine, NULL};
- // jesli argument ma dlugosc 1, nie bedziemy sie wiecej rozmnazac
- if(argLength == 1)
- {
- printf("%s \n", argvList[2]);
- exit(0);
- }
- int halfLength = argLength/2;
- // rozbijam argument na dwa male argumenciki
- char *argHalfA = malloc(sizeof(char) * ( halfLength +1));
- char *argHalfB = malloc(sizeof(char) * ( halfLength +1));
- strncpy(argHalfA, argument, halfLength);
- strncpy(argHalfB, argument+halfLength, halfLength);;
- argHalfA[argLength+1]='\0';
- argHalfB[argLength+1]='\0';
- // klonuje procesik
- child_pid1 = fork();
- // jesli jestem dzieckiem
- if(child_pid1 == 0)
- {
- // to zmieniam argumenty wywolania
- sprintf(argument, "%s", argHalfA);
- execv(argv[0], argvList);
- }
- // jesli jestem > 0 to jestem macierzysta
- if(child_pid1 > 0)
- { // w takim razie robie drugą dzidzie
- child_pid2 = fork();
- if(child_pid2 == 0)
- {
- // ale dzidzia B dostanie druga polowe rodzica - argHalfB
- sprintf(argument, "%s", argHalfB);
- execv(argv[0], argvList);
- } else {
- // czekamy na nasze dzieci
- // czekamy tak dlugo az zwroci nam 2xpid rozne od -1; -1 oznacza ze je porwano
- for(int finished = 0; finished<2; finished++)
- {
- pid = wait(&status);
- if(pid == -1)
- // jak je porwano, dekrementujemy pid i nie konczymy petli, bo moze kiedys wroca
- finished--;
- }
- printf("%s\n", argvList[2]);
- exit(0);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement