Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. #include <sys/stat.h>
  6. #include <sys/ipc.h>
  7. #include <sys/sem.h>
  8. #include <sys/shm.h>
  9. #include <err.h>
  10.  
  11. pid_t pid, pid1, pid2, pid3;
  12. int descriptor[2];
  13.  
  14. union semun
  15. {
  16. int val;
  17. struct semid_ds *buf;
  18. unsigned short int *array;
  19. struct seminfo *__buf;
  20. };
  21.  
  22. int semlock(int semid)
  23. {
  24. struct sembuf opr;
  25. opr.sem_num = 0;
  26. opr.sem_op = -1;
  27. opr.sem_flg = 0;
  28.  
  29. if (semop(semid, &opr, 1) == -1) {
  30. warn("Błąd blokowania semafora!\n");
  31. return 0;
  32. }
  33. else {
  34. return 1;
  35. }
  36. }
  37.  
  38. int semunlock(int semid)
  39. {
  40. struct sembuf opr;
  41.  
  42. opr.sem_num = 0;
  43. opr.sem_op = 1;
  44. opr.sem_flg = 0;
  45.  
  46. if (semop(semid, &opr, 1) == -1) {
  47. warn("Błąd odblokowania semafora!\n");
  48. return 0;
  49. }
  50. else {
  51. return 1;
  52. }
  53. }
  54.  
  55. char *decToHexa(int n)
  56. {
  57. char hexaDeciNum[100];
  58.  
  59. int i = 0;
  60. while(n!=0)
  61. {
  62. int temp = 0;
  63.  
  64. temp = n % 16;
  65.  
  66. if(temp < 10)
  67. {
  68. hexaDeciNum[i] = temp + 48;
  69. i++;
  70. }
  71. else
  72. {
  73. hexaDeciNum[i] = temp + 55;
  74. i++;
  75. }
  76.  
  77. n = n/16;
  78. }
  79.  
  80. return *hexaDeciNum;
  81. }
  82.  
  83. void PP1(char *input, int semid1, int semid2)
  84. {
  85. FILE *fifo = fopen("FIFO", "w");
  86. FILE *in = fopen(input, "r");
  87.  
  88. if(in != NULL && fifo != NULL)
  89. {
  90. printf("Pliki zostały otwarte poprawnie.\n");
  91. }
  92. else
  93. {
  94. printf("Błąd otwarcia pliku. Kończenie pracy procesu.\n");
  95. return;
  96. }
  97.  
  98. char buffer[15];
  99. int i;
  100.  
  101. semlock(semid1);
  102. printf("PP1:\n");
  103. for(i = 0; i < 15; i++)
  104. {
  105. buffer[i] = fgetc(in);
  106. printf("%c ", buffer[i]);
  107. }
  108. printf("\n");
  109. fputs(buffer, fifo);
  110.  
  111. fclose(fifo);
  112. fclose(in);
  113.  
  114. semunlock(semid2);
  115. }
  116.  
  117. void PP2(int semid2, int semid3)
  118. {
  119. FILE *fifo = fopen("FIFO", "r");
  120.  
  121. pipe(descriptor);
  122.  
  123. if(pipe != NULL && fifo != NULL)
  124. {
  125. printf("Pliki zostały otwarte poprawnie.\n");
  126. }
  127. else
  128. {
  129. printf("Błąd otawrcia pliku. Kończenie pracy procesu.\n");
  130. return;
  131. }
  132.  
  133. const void* buffer[15];
  134. int i;
  135.  
  136. semlock(semid2);
  137. printf("PP2:\n");
  138. for(i = 0; i < 15; i++)
  139. {
  140. //buffer[i] = decToHexa(fgetc(fifo));
  141. buffer[i] = fgetc(fifo);
  142. printf("%c ", buffer[i]);
  143. }
  144. printf("\n");
  145. close(descriptor[0]);
  146.  
  147. for(i = 0; i < 15; i++)
  148. {
  149. write(descriptor[1], buffer[i], sizeof(buffer[i]));
  150. }
  151.  
  152. fclose(fifo);
  153.  
  154. semunlock(semid3);
  155. }
  156.  
  157. void PP3(int semid3, int semid1)
  158. {
  159. close(descriptor[1]);
  160.  
  161. int i;
  162. char data[4];
  163.  
  164. semlock(semid3);
  165. printf("PP3:\n");
  166. for(i = 0; i < 15; i++)
  167. {
  168. read(descriptor[0], data, sizeof(data));
  169. }
  170. printf("\n");
  171.  
  172. semunlock(semid1);
  173. }
  174.  
  175. int main(int argc, char *argv[])
  176. {
  177. key_t key1, key2, key3;
  178. int semid1, semid2, semid3;
  179. union semun ctl;
  180. ctl.val = 1;
  181. if ((key1 = ftok(".", 'A')) == -1)
  182. errx(1, "Blad tworzenia klucza!");
  183. if ((semid1 = semget(key1, 1, IPC_CREAT | 0600)) == -1)
  184. errx(2, "Blad tworzenia semafora!");
  185. if (semctl(semid1, 0, SETVAL, ctl) == -1)
  186. errx(3, "Blad ustawiania semafora!");
  187. if ((key2 = ftok(".", 'B')) == -1)
  188. errx(1, "Blad tworzenia klucza!");
  189. if ((semid2 = semget(key2, 1, IPC_CREAT | 0600)) == -1)
  190. errx(2, "Blad tworzenia semafora!");
  191. ctl.val = 1;
  192. if (semctl(semid2, 0, SETVAL, ctl) == -1)
  193. errx(3, "Blad ustawiania semafora!");
  194. if ((key3 = ftok(".", 'A')) == -1)
  195. errx(1, "Blad tworzenia klucza!");
  196. if ((semid3 = semget(key3, 1, IPC_CREAT | 0600)) == -1)
  197. errx(2, "Blad tworzenia semafora!");
  198. if (semctl(semid3, 0, SETVAL, ctl) == -1)
  199. errx(3, "Blad ustawiania semafora!");
  200. semlock(semid2);
  201. semlock(semid3);
  202. mkfifo("FIFO", 0777);
  203.  
  204. pid = getpid();
  205.  
  206. if(!fork())
  207. {
  208. pid1 = getpid();
  209. PP1(argv[1], semid1, semid2);
  210. }
  211.  
  212. if(!fork())
  213. {
  214. pid2 = getpid();
  215. PP2(semid2, semid3);
  216. }
  217.  
  218. if(!fork())
  219. {
  220. pid3 = getpid();
  221. PP3(semid3, semid1);
  222. }
  223.  
  224. return 0;
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement