Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h> //exit
  3. #include<unistd.h> //sleep
  4. #include<signal.h> //signal
  5.  
  6. #define STOP SIGBUS
  7. #define START SIGILL
  8. #define DATA_SAVED SIGUSR1
  9. #define CEZAR_OFFSET 5
  10. #define BUFFER_SIZE 100
  11.  
  12. volatile int read_data = 0;
  13. volatile int save_data = 1;
  14.  
  15. const char* FILENAME = "data";
  16.  
  17. int pid_producent;
  18. int pid_konsument;
  19.  
  20. void sig_handler(int sig)
  21. {
  22. switch(sig)
  23. {
  24. case STOP:
  25. signal(DATA_SAVED, SIG_IGN);
  26. break;
  27. case START:
  28. signal(DATA_SAVED, sig_handler);
  29. break;
  30. case DATA_SAVED:
  31. read_data = 1;
  32. break;
  33. default:
  34.  
  35. break;
  36. }
  37. }
  38.  
  39. void zero_table(unsigned char* tab, int s)
  40. {
  41. for(int i = 0; i < s; i++)
  42. tab[i] = 0;
  43. }
  44.  
  45. void producent()
  46. {
  47. FILE *file;
  48. unsigned char BUFFER[BUFFER_SIZE];
  49. printf("PID producent: %d\n", getpid());
  50.  
  51. while(1)
  52. {
  53. zero_table(BUFFER, BUFFER_SIZE);
  54. scanf("%s", BUFFER);
  55.  
  56. if((file=fopen(FILENAME, "w"))==NULL){
  57. printf("BĹ‚Ä…d odczytu pliku");
  58. exit(1);
  59. }
  60.  
  61. for(int i=0; i<BUFFER_SIZE; i++)
  62. fputc(BUFFER[i], file);
  63.  
  64. fclose(file);
  65.  
  66. save_data = 0;
  67.  
  68. kill(pid_konsument, DATA_SAVED);
  69. }
  70.  
  71. return;
  72. }
  73.  
  74. void cezar(unsigned char* data, int size)
  75. {
  76. for(int i = 0; i < size; i++)
  77. data[i] = (data[i] + CEZAR_OFFSET) % 255;
  78. }
  79.  
  80. void konsument()
  81. {
  82. FILE *file;
  83. unsigned char BUFFER[BUFFER_SIZE];
  84. printf("PID konsument: %d\n", getpid());
  85.  
  86. while(1)
  87. {
  88. if(read_data)
  89. {
  90. zero_table(BUFFER, BUFFER_SIZE);
  91.  
  92. if((file=fopen(FILENAME, "r"))==NULL){
  93. printf("BĹ‚Ä…d odczytu pliku");
  94. exit(1);
  95. }
  96.  
  97. int letter;
  98. for(int i=0; i<BUFFER_SIZE; i++)
  99. {
  100. if((letter = fgetc(file))!=EOF)
  101. BUFFER[i] = letter;
  102. else break;
  103. }
  104.  
  105. fclose(file);
  106.  
  107. cezar(BUFFER, BUFFER_SIZE);
  108.  
  109. for(int i = 0; i < BUFFER_SIZE; i++)
  110. putc(BUFFER[i], stderr);
  111. printf("\n");
  112.  
  113. read_data = 0;
  114. }else sleep(1);
  115. }
  116.  
  117. return;
  118. }
  119.  
  120. int main(void){
  121.  
  122. signal(START, sig_handler);
  123. signal(STOP, sig_handler);
  124. signal(DATA_SAVED, sig_handler);
  125.  
  126. pid_konsument = fork();
  127.  
  128. if(pid_konsument == 0)
  129. konsument();
  130.  
  131. pid_producent = fork();
  132.  
  133. if(pid_producent == 0)
  134. producent();
  135.  
  136. printf("PID rodzic: %d\n", getpid());
  137.  
  138. signal(START, SIG_IGN);
  139. signal(STOP, SIG_IGN);
  140. signal(DATA_SAVED, SIG_IGN);
  141.  
  142. while(1)
  143. sleep(1);
  144.  
  145. return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement