Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h> //exit
- #include<unistd.h> //sleep
- #include<signal.h> //signal
- #define STOP SIGBUS
- #define START SIGILL
- #define DATA_SAVED SIGUSR1
- #define CEZAR_OFFSET 5
- #define BUFFER_SIZE 100
- volatile int read_data = 0;
- volatile int save_data = 1;
- const char* FILENAME = "data";
- int pid_producent;
- int pid_konsument;
- void sig_handler(int sig)
- {
- switch(sig)
- {
- case STOP:
- signal(DATA_SAVED, SIG_IGN);
- break;
- case START:
- signal(DATA_SAVED, sig_handler);
- break;
- case DATA_SAVED:
- read_data = 1;
- break;
- default:
- break;
- }
- }
- void zero_table(unsigned char* tab, int s)
- {
- for(int i = 0; i < s; i++)
- tab[i] = 0;
- }
- void producent()
- {
- FILE *file;
- unsigned char BUFFER[BUFFER_SIZE];
- printf("PID producent: %d\n", getpid());
- while(1)
- {
- zero_table(BUFFER, BUFFER_SIZE);
- scanf("%s", BUFFER);
- if((file=fopen(FILENAME, "w"))==NULL){
- printf("BĹ‚Ä…d odczytu pliku");
- exit(1);
- }
- for(int i=0; i<BUFFER_SIZE; i++)
- fputc(BUFFER[i], file);
- fclose(file);
- save_data = 0;
- kill(pid_konsument, DATA_SAVED);
- }
- return;
- }
- void cezar(unsigned char* data, int size)
- {
- for(int i = 0; i < size; i++)
- data[i] = (data[i] + CEZAR_OFFSET) % 255;
- }
- void konsument()
- {
- FILE *file;
- unsigned char BUFFER[BUFFER_SIZE];
- printf("PID konsument: %d\n", getpid());
- while(1)
- {
- if(read_data)
- {
- zero_table(BUFFER, BUFFER_SIZE);
- if((file=fopen(FILENAME, "r"))==NULL){
- printf("BĹ‚Ä…d odczytu pliku");
- exit(1);
- }
- int letter;
- for(int i=0; i<BUFFER_SIZE; i++)
- {
- if((letter = fgetc(file))!=EOF)
- BUFFER[i] = letter;
- else break;
- }
- fclose(file);
- cezar(BUFFER, BUFFER_SIZE);
- for(int i = 0; i < BUFFER_SIZE; i++)
- putc(BUFFER[i], stderr);
- printf("\n");
- read_data = 0;
- }else sleep(1);
- }
- return;
- }
- int main(void){
- signal(START, sig_handler);
- signal(STOP, sig_handler);
- signal(DATA_SAVED, sig_handler);
- pid_konsument = fork();
- if(pid_konsument == 0)
- konsument();
- pid_producent = fork();
- if(pid_producent == 0)
- producent();
- printf("PID rodzic: %d\n", getpid());
- signal(START, SIG_IGN);
- signal(STOP, SIG_IGN);
- signal(DATA_SAVED, SIG_IGN);
- while(1)
- sleep(1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement