Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Zad : Zaimplementować 4 procesy z których 3(PK1,PK2,PK3) pełni rolę konsumentów a 1 producenta(PP) który ma pobierać ciagi znaków z stdin i zapisywać je do pamięci współdzielonej
- ppkt 1: konsumenci ścigają się do zawartosci pamięci współdzielonej, tylko 1 ma odebrać ciąg znaków
- #include <unistd.h>
- #include <string.h>
- #include <semaphore.h>
- #include <sys/mman.h>
- #include <sys/wait.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include<fcntl.h>
- pid_t wrap(void (*process_callback)(void))
- {
- pid_t pid = fork();
- switch(pid) {
- case -1:
- printf("Blad funkcji fork.");
- exit(1);
- case 0:
- process_callback();
- return 0;
- default:
- //ZWRACA PROCES ID
- return pid;
- }
- }
- static char* komunikat;
- sem_t* semaphore;
- int* status_komunikatu;
- void p1()
- {
- while(1)
- {
- sem_wait(semaphore);
- if(*status_komunikatu)
- {
- printf("PK1, PID: %d, komunikat: %s\n", getpid(), komunikat);
- *status_komunikatu = 0;
- }
- sem_post(semaphore);
- }
- void p2()
- {
- while(1)
- {
- sem_wait(semaphore);
- if(*status_komunikatu)
- {
- printf("PK2, PID: %d, komunikat: %s\n",getpid(),komunikat);
- *status_komunikatu = 0;
- }
- sem_post(semaphore);
- }
- }
- void p3()
- {
- while(1)
- {
- sem_wait(semaphore);
- if(*status_komunikatu)
- {
- printf("PK3, PID: %d, komunikat: %s\n",getpid(),komunikat);
- *status_komunikatu = 0;
- }
- sem_post(semaphore); //odpowiada za inkrementacje
- }
- }
- #define wspoldzielona_zmienna(name,type,num) name = (type*)mmap(NULL,sizeof(type)*num,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1,0)
- int main(int argc, char const *argv[])
- {
- wspoldzielona_zmienna(komunikat, char, 80);
- wspoldzielona_zmienna(status_komunikatu, int, 1);
- wspoldzielona_zmienna(semaphore, sem_t, 3);
- sem_init(semaphore, 1, 1); /
- *status_komunikatu = 0;
- pid_t proces1 = wrap(p1);
- pid_t proces2 = wrap(p2);
- pid_t proces3 = wrap(p3);
- int run = 1;
- while(run)
- {
- scanf("%s",komunikat); // uzytkownik podaje z klawiatury
- if(strcmp(komunikat, "exit") == 0) run = 0; // jezeli string == 'exit' to wychodzimy z programu
- /*wypisuje komunikat*/
- printf("PP, PID: %d, komunikat: %s\n",getpid(),komunikat);
- *status_komunikatu = 1;
- }
- kill(proces1, SIGTERM);
- kill(proces2, SIGTERM);
- kill(proces3, SIGTERM);
- return 0;
- }
- ppkt2: procesy potomne PK1 PK2 PK3 mają po kolei odbierać od procesu macierzystego PP komunikaty w kolejności PK1->PK2->PK3 (każdy proces odbiera 1 komunikat na raz tzn. komunikat1:PK1->komunikat2-:PK2->komunikat3:PK3->komunikat4:PK1 etc.
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/shm.h>
- #include <errno.h>
- #include <semaphore.h>
- #include <string.h>
- #include <unistd.h>
- #include<sys/wait.h>
- #include<fcntl.h>
- void* shmem;
- sem_t* sem1;
- sem_t* sem2;
- sem_t* sem3;
- sem_t* sem4;
- void* create_shared_memory(size_t size) {
- int protection = PROT_READ | PROT_WRITE;
- int visibility = MAP_ANONYMOUS | MAP_SHARED;
- return mmap(NULL, size, protection, visibility, 0, 0);
- }
- pid_t wrap(void (*process_callback)(void))
- {
- pid_t pid = fork();
- switch(pid) {
- case -1:
- printf("Blad funkcji fork.");
- exit(1);
- case 0:
- process_callback();
- return 0;
- default:
- return pid;
- }
- }
- void p3()
- {
- while(1)
- {
- sem_wait(sem3);
- char* x = shmem;
- printf("PK3, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);
- }
- }
- void p2()
- {
- while(1)
- {
- sem_wait(sem4);
- char* x = shmem;
- printf("PK2, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);//odpowiada za inkrementacje
- }
- }
- void p1()
- {
- while(1)
- {
- sem_wait(sem2);
- char* x = shmem;
- printf("PK1, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);
- }
- }
- int main() {
- char parent_message[100];
- shmem = create_shared_memory(128);
- char* name1 = "bartekk";
- char* name2 = "bartekkk";
- char* name3 = "bartekkkkk";
- char* name4 = "bartekkkkkk";
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- sem1 = sem_open(name1, O_CREAT, 0777, 1);
- sem2 = sem_open(name2, O_CREAT, 0777, 0);
- sem3 = sem_open(name3, O_CREAT, 0777, 0);
- sem4 = sem_open(name4, O_CREAT, 0777, 0);
- int count = 1;
- int run=0;
- pid_t proces3 = wrap(p3);
- pid_t proces2 = wrap(p2);
- pid_t proces1 = wrap(p1);
- while(run == 0)
- {
- sem_wait(sem1);
- scanf("%s",parent_message);
- if(strcmp(parent_message, "exit") == 0) run = 1;
- printf("PP, PID: %d, komunikat: %s\n", getpid(), parent_message);
- memcpy(shmem, parent_message, sizeof(parent_message));
- if(count == 1)sem_post(sem2);
- if(count == 2)sem_post(sem4);
- if(count == 3)
- {
- sem_post(sem3);
- count = 1;
- }
- else count += 1;
- }
- kill(proces1, SIGTERM);
- kill(proces2, SIGTERM);
- kill(proces3, SIGTERM);
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- return 0;
- }
- ppkt3: procesy potomne PK1 PK2 PK3 mają odbierać od procesu macierzystego PP każdy komunikat w kolejności PK1->PK2->PK3
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/shm.h>
- #include <errno.h>
- #include <semaphore.h>
- #include <string.h>
- #include <unistd.h>
- #include<sys/wait.h>
- #include<fcntl.h>
- void* shmem;
- sem_t* sem1;
- sem_t* sem2;
- sem_t* sem3;
- sem_t* sem4;
- sem_t* sem5;
- void* create_shared_memory(size_t size) {
- int protection = PROT_READ | PROT_WRITE;
- int visibility = MAP_ANONYMOUS | MAP_SHARED;
- return mmap(NULL, size, protection, visibility, 0, 0);
- }
- pid_t wrap(void (*process_callback)(void))
- {
- pid_t pid = fork();
- switch(pid) {
- case -1:
- printf("Blad funkcji fork.");
- exit(1);
- case 0:
- process_callback();
- return 0;
- default:
- return pid;
- }
- }
- void p3()
- {
- while(1)
- {
- sem_wait(sem5);
- char* x = shmem;
- printf("PK3, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);
- }
- }
- void p2()
- {
- while(1)
- {
- sem_wait(sem4);
- char* x = shmem;
- printf("PK2, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem3);
- }
- }
- void p1()
- {
- while(1)
- {
- sem_wait(sem2);
- char* x = shmem;
- printf("PK1, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem3);
- }
- }
- int main() {
- char parent_message[100];
- shmem = create_shared_memory(128);
- char* name1 = "bartekk";
- char* name2 = "bartekkk";
- char* name3 = "bartekkkk";
- char* name4 = "bartekkkkk";
- char* name5 = "bartekkkkkk";
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- sem_unlink(name5);
- sem1 = sem_open(name1, O_CREAT, 0777, 1);
- sem2 = sem_open(name2, O_CREAT, 0777, 0);
- sem3 = sem_open(name3, O_CREAT, 0777, 0);
- sem4 = sem_open(name4, O_CREAT, 0777, 0);
- sem5 = sem_open(name5, O_CREAT, 0777, 0);
- int run=0;
- pid_t proces3 = wrap(p3);
- pid_t proces2 = wrap(p2);
- pid_t proces1 = wrap(p1);
- while(run == 0)
- {
- scanf("%s",parent_message);
- if(strcmp(parent_message, "exit") == 0) run = 1;
- printf("PP, PID: %d, komunikat: %s\n", getpid(), parent_message);
- memcpy(shmem, parent_message, sizeof(parent_message));
- sem_post(sem2);
- sem_wait(sem3);
- sem_post(sem4);
- sem_wait(sem3);
- sem_post(sem5);
- }
- kill(proces1, SIGTERM);
- kill(proces2, SIGTERM);
- kill(proces3, SIGTERM);
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- sem_unlink(name5);
- return 0;
- }
- ppkt4: procesy potomne PK1 PK2 PK3 mają odbierać od procesu macierzystego PP po jednym komunikacie tak że PK1 ma dwa razy częściej odbierać komunikaty od PK2 który z kolei ma dwa razy częściej odebrać komunikaty niż PK3
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/shm.h>
- #include <errno.h>
- #include <semaphore.h>
- #include <string.h>
- #include <unistd.h>
- #include<sys/wait.h>
- #include<fcntl.h>
- void* shmem;
- sem_t* sem1;
- sem_t* sem2;
- sem_t* sem3;
- sem_t* sem4;
- void* create_shared_memory(size_t size) {
- int protection = PROT_READ | PROT_WRITE;
- int visibility = MAP_ANONYMOUS | MAP_SHARED;
- return mmap(NULL, size, protection, visibility, 0, 0);
- }
- pid_t wrap(void (*process_callback)(void))
- {
- pid_t pid = fork();
- switch(pid) {
- case -1:
- printf("Blad funkcji fork.");
- exit(1);
- case 0:
- process_callback();
- return 0;
- default:
- return pid;
- }
- }
- void p3()
- {
- while(1)
- {
- sem_wait(sem3);
- char* x = shmem;
- printf("PK3, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);
- }
- }
- void p2()
- {
- while(1)
- {
- sem_wait(sem4);
- char* x = shmem;
- printf("PK2, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);//odpowiada za inkrementacje
- }
- }
- void p1()
- {
- while(1)
- {
- sem_wait(sem2);
- char* x = shmem;
- printf("PK1, PID: %d, komunikat: %s\n", getpid(), x);
- sem_post(sem1);
- }
- }
- int main() {
- char parent_message[100];
- shmem = create_shared_memory(128);
- char* name1 = "bartekk";
- char* name2 = "bartekkk";
- char* name3 = "bartekkkkk";
- char* name4 = "bartekkkkkk";
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- sem1 = sem_open(name1, O_CREAT, 0777, 1);
- sem2 = sem_open(name2, O_CREAT, 0777, 0);
- sem3 = sem_open(name3, O_CREAT, 0777, 0);
- sem4 = sem_open(name4, O_CREAT, 0777, 0);
- int count = 1
- int run=0;
- pid_t proces3 = wrap(p3);
- pid_t proces2 = wrap(p2);
- pid_t proces1 = wrap(p1);
- while(run == 0)
- {
- sem_wait(sem1);
- scanf("%s",parent_message);
- if(strcmp(parent_message, "exit") == 0) run = 1;
- printf("PP, PID: %d, komunikat: %s\n", getpid(), parent_message);
- memcpy(shmem, parent_message, sizeof(parent_message));
- if(count == 1 || count == 2 || count == 4 || count == 5)sem_post(sem2);
- if(count == 3 || count == 6)sem_post(sem4);
- if(count == 7){ sem_post(sem3);count=1;}
- else count +=1;
- }
- kill(proces1, SIGTERM);
- kill(proces2, SIGTERM);
- kill(proces3, SIGTERM);
- sem_unlink(name1);
- sem_unlink(name2);
- sem_unlink(name3);
- sem_unlink(name4);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement