Advertisement
Guest User

Untitled

a guest
Mar 20th, 2017
634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. // SO2 IS1 220A LAB03
  2. // Olga Chróstowska
  3.  
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <sys/wait.h>
  10.  
  11. int main(int argc, char **argv)
  12. {
  13. int status = 0;
  14. pid_t child_pid1, child_pid2, pid;
  15.  
  16. char argsLine[1024];
  17.  
  18. if(argc <= 1)
  19. {
  20. printf("Nakarm program argumencikiem, bo nie zadziała! :)");
  21. exit(0);
  22. }
  23.  
  24. if(argv[2] == NULL)
  25. {
  26. argv[2] = "";
  27. }
  28.  
  29. // sprawdzam dlugosc argumentu wywolania
  30. int argLength = strlen(argv[1]);
  31. // alokuje sobie pamiec na skroconego stringa lub jego kopie
  32. char *argument = malloc( sizeof(char) * ( argLength + 1 ));
  33. // jelsi mam nieparzysta ilosc znakow i nie jest to pojedyncza litera, bede chciala go uciac, wiec zmniejszam dluzgos
  34. if((argLength % 2) == 1 && argLength>1) {
  35. argLength = argLength-1;
  36. }
  37. // kopiuje argv[1] do argument ewentualnie obcinajac ostatni znak
  38. strncpy(argument, argv[1], argLength);
  39. // zapisuje do argsline dotychczasowy argsline - lancuch wywolan i dolaczam ostatni przekazany argument
  40. sprintf(argsLine, "%s %s", argv[2], argv[1]);
  41. //
  42. char *argvList[] = {argv[0], argument, argsLine, NULL};
  43.  
  44. // jesli argument ma dlugosc 1, nie bedziemy sie wiecej rozmnazac
  45. if(argLength == 1)
  46. {
  47. printf("%s \n", argvList[2]);
  48. exit(0);
  49. }
  50.  
  51. int halfLength = argLength/2;
  52. // rozbijam argument na dwa male argumenciki
  53. char *argHalfA = malloc(sizeof(char) * ( halfLength +1));
  54. char *argHalfB = malloc(sizeof(char) * ( halfLength +1));
  55. strncpy(argHalfA, argument, halfLength);
  56. strncpy(argHalfB, argument+halfLength, halfLength);;
  57. argHalfA[argLength+1]='\0';
  58. argHalfB[argLength+1]='\0';
  59.  
  60. // klonuje procesik
  61. child_pid1 = fork();
  62. // jesli jestem dzieckiem
  63. if(child_pid1 == 0)
  64. {
  65. // to zmieniam argumenty wywolania
  66. sprintf(argument, "%s", argHalfA);
  67. execv(argv[0], argvList);
  68. }
  69. // jesli jestem > 0 to jestem macierzysta
  70. if(child_pid1 > 0)
  71. { // w takim razie robie drugą dzidzie
  72. child_pid2 = fork();
  73. if(child_pid2 == 0)
  74. {
  75. // ale dzidzia B dostanie druga polowe rodzica - argHalfB
  76. sprintf(argument, "%s", argHalfB);
  77. execv(argv[0], argvList);
  78. } else {
  79. // czekamy na nasze dzieci
  80. // czekamy tak dlugo az zwroci nam 2xpid rozne od -1; -1 oznacza ze je porwano
  81. for(int finished = 0; finished<2; finished++)
  82. {
  83. pid = wait(&status);
  84. if(pid == -1)
  85. // jak je porwano, dekrementujemy pid i nie konczymy petli, bo moze kiedys wroca
  86. finished--;
  87. }
  88.  
  89. printf("%s\n", argvList[2]);
  90. exit(0);
  91. }
  92. }
  93.  
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement