Advertisement
Guest User

Untitled

a guest
Jan 24th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>
  7. #include <sys/ipc.h>
  8. #include <sys/sem.h>
  9. #include <unistd.h>
  10.  
  11. void utworz_semafor();
  12. void ustaw_semafor();
  13. void usun_semafor();
  14. void usun_potomne(int n);
  15.  
  16. key_t key;
  17. int semafor;
  18. int numer_sem=1;
  19. int i;
  20.  
  21. int main(int argc, char* argv[])
  22. {
  23. if(argc!=4)
  24. {
  25. printf("Zla liczba argumentow\n");
  26. exit(0);
  27. }
  28.  
  29. int limit=atoi(getenv("LIMIT"));
  30. FILE *ptr;
  31. system("ps -ux 2>/dev/null | wc -l > ./tmp");
  32. char str[20];
  33. ptr=fopen("tmp", "r");
  34. fgets(str, 20, ptr);
  35.  
  36. limit -= atoi(str)-1;
  37.  
  38. printf("Users: %d\n", limit);
  39. if(atoi(argv[3]) > limit + 1)
  40. {
  41. printf("Niewystarczajacy limit procesow uzytkownika\n");
  42. exit(-2);
  43. }
  44. utworz_semafor();
  45. ustaw_semafor();
  46.  
  47. char semafor_str[40];
  48. sprintf(semafor_str, "%d", semafor);
  49.  
  50.  
  51. for(i=0; i<atoi(argv[3]); i++)
  52. {
  53. switch(fork())
  54. {
  55. case -1:
  56. perror("FORK ERROR");
  57. usun_potomne(i);
  58. usun_semafor();
  59. exit(1);
  60. break;
  61. case 0:
  62. if(execl(argv[1], argv[1], semafor_str, argv[3], NULL)==0)
  63. {
  64. perror("Execl error");
  65. usun_potomne(i);
  66. usun_semafor();
  67. exit(-1);
  68. }
  69. break;
  70. default:
  71. sleep(1);
  72. break;
  73. }
  74. }
  75.  
  76. usun_potomne(atoi(argv[3]));
  77. usun_semafor();
  78. fclose(ptr);
  79.  
  80. return 0;
  81. }
  82.  
  83. void utworz_semafor()
  84. {
  85. key=ftok(".",'P');
  86. if(key==-1)
  87. {
  88. perror("FTOK ERROR");
  89. exit(1);
  90. }
  91. semafor=semget(key, numer_sem, 0600|IPC_CREAT);
  92. if(semafor==-1)
  93. {
  94. perror("SEMGET ERROR");
  95. exit(1);
  96. }
  97. else
  98. printf("Utworzono semafory - ID: %d, key: %d\n", semafor, key);
  99. }
  100.  
  101. void ustaw_semafor()
  102. {
  103. int ustaw_sem;
  104. for(i=0; i<numer_sem; i++)
  105. {
  106. ustaw_sem=semctl(semafor, i, SETVAL, 1);
  107. if(ustaw_sem==-1)
  108. {
  109. perror("SEMCTL ERROR");
  110. exit(1);
  111. }
  112. else
  113. printf("Ustawiono semafor\n");
  114. }
  115. }
  116.  
  117. void usun_semafor()
  118. {
  119. int usun_sem;
  120. usun_sem=semctl(semafor, 0, IPC_RMID);
  121. if(usun_sem==-1)
  122. {
  123. perror("Semctl error");
  124. exit(-1);
  125. }
  126. else
  127. printf("Usunieto semafory\n");
  128. }
  129.  
  130. void usun_potomne(int n)
  131. {
  132. int i, status, w;
  133. for(i=0; i<n; i++)
  134. {
  135. w=wait(&status);
  136. if(w==-1)
  137. {
  138. perror("WAIT ERROR");
  139. usun_semafor();
  140. exit(1);
  141. }
  142. printf("Koniec procesu. PID: %d, status: %d\n", w, status);
  143. }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement