Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/wait.h>
  7.  
  8. int main(int argc, char **argv){
  9. //printf("0: %s \n", argv[0]);
  10. //printf("start pid: %d arg: %s\n", getpid(), argv[1]);
  11.  
  12.  
  13. //pierwszy arg - nazwa uruchamianego pliku
  14. if (argc > 2 || argc == 1 || strlen(argv[1]) > 20) {
  15. fprintf (stderr, "Blad argumentow");
  16. exit(1);
  17. }
  18.  
  19. if (strlen(argv[1]) == 1) {
  20. exit(argv[1][0]);
  21. //return argv[1][0];
  22. //printf("%d", argv[1][0]);
  23. }
  24.  
  25. else {
  26. int dlugosc = strlen(argv[1]);
  27. int polowa = dlugosc/2;
  28. char *pierwszaPolowa = malloc(sizeof(char) * polowa);
  29. char *drugaPolowa;
  30. if (dlugosc % 2 == 0) {
  31. drugaPolowa = malloc(sizeof(char) * polowa);
  32. } else {
  33. drugaPolowa = malloc(sizeof(char) * polowa+1);
  34. }
  35.  
  36. for (int i =0; i< polowa ; i++ ) {
  37. pierwszaPolowa[i] = argv[1][i];
  38. }
  39.  
  40. int index = 0;
  41. for (int i = polowa; i<dlugosc; i++){
  42. drugaPolowa[index] = argv[1][i];
  43. index++;
  44. }
  45.  
  46. int child1pid=fork();
  47. int child2pid;
  48.  
  49.  
  50. if (child1pid == 0) {
  51. //execl - pierwszy argument - sciezka do pliku, drugi - pierwszy(zerowy) argument programu, ktory ma zostac uruchiomiony
  52. execl(argv[0], argv[0], pierwszaPolowa, NULL);
  53. }
  54.  
  55.  
  56. if (child1pid > 0) { //parent
  57. child2pid = fork();
  58. if (child2pid == 0 ) {
  59. execl(argv[0], argv[0], drugaPolowa, NULL);
  60. }
  61. }
  62.  
  63. int status, status2;
  64. int pid1 = wait(&status);
  65. printf("wynik: %d %d %s %c\n", getpid(), pid1, pid1 == child1pid ? pierwszaPolowa : drugaPolowa, WEXITSTATUS(status));
  66.  
  67. int pid2= wait(&status2);
  68. printf("wynik: %d %d %s %c\n", getpid(), pid2, pid2 == child2pid ? drugaPolowa : pierwszaPolowa, WEXITSTATUS(status2));
  69.  
  70.  
  71. free(pierwszaPolowa);
  72. free(drugaPolowa);
  73.  
  74. //konczy program, zwraca wiekszy z kodow powrotu otrzymanych od dzieci
  75. exit(WEXITSTATUS(status) > WEXITSTATUS(status2) ? WEXITSTATUS(status) : WEXITSTATUS(status2));
  76. }
  77.  
  78. return 0;
  79.  
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement