Advertisement
Guest User

Lab10

a guest
Dec 16th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <sys/ipc.h>
  8. #include <sys/shm.h>
  9. #include <stdlib.h>
  10. #include <err.h>
  11. #include <sys/sem.h>
  12. #include <err.h>
  13. #include <string.h>
  14.  
  15.  
  16. #define SHM_SIZE sizeof(char)
  17.  
  18.  
  19. union semun
  20. {
  21. int val;
  22. struct semid_ds *buf;
  23. unsigned short int *array;
  24. struct seminfo *__buf;
  25. };
  26.  
  27. int semlock(int semid)
  28. {
  29.  
  30. struct sembuf opr;
  31. opr.sem_num = 0;
  32. opr.sem_op = -1;
  33. opr.sem_flg = 0;
  34.  
  35. if (semop(semid, &opr, 1) == -1){
  36. warn("Blad blokowania semafora!");
  37. return 0;
  38. }else{
  39. return 1;
  40. }
  41. }
  42.  
  43. int semunlock(int semid)
  44. {
  45. struct sembuf opr;
  46.  
  47. opr.sem_num = 0;
  48. opr.sem_op = 1;
  49. opr.sem_flg = 0;
  50.  
  51. if (semop(semid, &opr, 1) == -1)
  52. {
  53. warn("Blad odblokowania semafora!");
  54. return 0;
  55. }
  56. else
  57. {
  58. return 1;
  59. }
  60. }
  61.  
  62. int main(int argc, char *argv[])
  63. {
  64.  
  65. printf("Podaj nazwe pliku do otwarcia: ");
  66. char filename[20];
  67. char text[256];
  68. char ch;
  69. int caesarkey;
  70. scanf("%s", filename);
  71. FILE* file = fopen(filename, "r+");
  72. if(file == NULL) {
  73. printf("Blad przy odczytywaniu pliku!");
  74. return -1;
  75. }
  76. printf("Otworzono plik. Podaj klucz do szyfru Cezara: ");
  77.  
  78. scanf("%d", &caesarkey);
  79. caesarkey%=256;
  80. int i = 0; // wczytywanie
  81. while((ch = fgetc(file)) != EOF) {
  82. text[i]= ch;
  83. i++;
  84. }
  85. text[i] = '\0';
  86. printf("Wczytano:\n%s\n", text);
  87. printf("Podaj nazwe pliku do zapisu: ");
  88. char filename2[20];
  89. scanf("%s", filename2);
  90. FILE* file2 = fopen(filename2, "w+");
  91. if(file2 == NULL) {
  92. printf("Blad przy otwieraniu pliku do zapisu!");
  93. return -2;
  94. }
  95.  
  96.  
  97. key_t key1, key2; // klucz dla semaforow
  98. int semid1, semid2; // ID semaforow
  99. union semun ctl; // unia do kontroli semafora
  100.  
  101.  
  102. if ((key1 = ftok(".", 'A')) == -1)
  103. errx(1, "Blad tworzenia klucza!");
  104.  
  105. if ((semid1 = semget(key1, 1, IPC_CREAT | 0600)) == -1)
  106. errx(2, "Blad tworzenia semafora!");
  107.  
  108. ctl.val = 1;
  109. if (semctl(semid1, 0, SETVAL, ctl) == -1)
  110. errx(3, "Blad ustawiania semafora!");
  111.  
  112. if ((key2 = ftok(".", 'B')) == -1)
  113. errx(1, "Blad tworzenia klucza!");
  114.  
  115. if ((semid2 = semget(key2, 1, IPC_CREAT | 0600)) == -1)
  116. errx(2, "Blad tworzenia semafora!");
  117.  
  118. ctl.val = 1;
  119. if (semctl(semid2, 0, SETVAL, ctl) == -1)
  120. errx(3, "Blad ustawiania semafora!");
  121.  
  122. semlock(semid2);
  123.  
  124.  
  125. int datakey;
  126. if ((datakey = ftok(".", 'A')) == -1)
  127. errx(1, "Blad tworzenia klucza!");
  128. int shmid;
  129. char *shm;
  130. if ((shmid = shmget(datakey, SHM_SIZE, IPC_CREAT | 0666)) < 0)
  131. errx(2, "Blad tworzenia segmentu pamieci dzielonej!");
  132. if ((shm = shmat(shmid, NULL, 0)) == (char *) -1)
  133. errx(3, "Blad przylaczania pamieci dzielonej!");
  134.  
  135. int ilosc_znakow = strlen(text);
  136. int j = 0;
  137.  
  138. if(fork())
  139. {
  140. for(i = 0; i < ilosc_znakow; i++)
  141. {
  142. semlock(semid1);
  143. char*floatmem = (char*)shm;
  144. *floatmem = text[j++];
  145. printf("Znak w PP1: %c\n", *floatmem);
  146. fflush(stdout);
  147. semunlock(semid2);
  148. }
  149. }
  150. else
  151. {
  152. for(i = 0; i < ilosc_znakow; i++)
  153. {
  154. semlock(semid2);
  155. char*floatmem = (char*)shm;
  156. char znak= *floatmem;
  157. printf("Znak w PP2: %c\n", znak);
  158.  
  159. if(znak>='a' && znak<='z') { // szyfrowanie
  160. znak+=caesarkey;
  161. if(znak > 'z' )
  162. znak-=26;
  163. }
  164. if(znak>='A' && znak<='Z') {
  165. znak+=caesarkey;
  166. if(znak > 'Z' )
  167. znak-=26;
  168. }
  169. printf("Zaszyfrowany znak w PP2: %c\n", znak);
  170. fprintf(file2,"%c",znak);
  171.  
  172. semunlock(semid1);
  173. }
  174. }
  175. shmdt(shm);
  176. shmctl(shmid, IPC_RMID, NULL);
  177.  
  178. return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement