Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "lib.h"
- #include <semaphore.h>
- #include <unistd.h>
- #include <time.h>
- #include <sys/wait.h>
- typedef struct {
- int cnt;
- int cnt2;
- sem_t sem;
- sem_t mutex;
- sem_t sem2;
- }shared_str;
- //global shared mem
- shared_str *st;
- void wall(int i, int n){
- for(int j = 0; j < 5; j++)
- {
- sem_wait(&st->mutex);
- st->cnt++;
- if(st->cnt == n){
- printf("prisiel posledny proces \n");
- sem_wait(&st->sem2);
- sem_post(&st->sem);
- }
- sem_post(&st->mutex);
- printf("proces c.[%d] caka\n", i);
- sem_wait(&st->sem);
- printf("proces c.[%d] ide dalej \n", i);
- sem_post(&st->sem);
- sem_wait(&st->mutex);
- st->cnt--;
- if(st->cnt == 0){
- printf("prisiel zasa posledny proces \n ");
- sem_post(&st->sem2);
- sem_wait(&st->sem);
- }
- sem_post(&st->mutex);
- sem_wait(&st->sem2);
- sem_post(&st->sem2);
- }
- }
- int main(){
- int n = 10;
- st = (shared_str*) malloc_shared(sizeof(shared_str));
- sem_init(&st->mutex , 1, 1);
- sem_init(&st->sem , 1, 0);
- sem_init(&st->sem2 , 1, 1);
- st->cnt = 0;
- st->cnt2 = 0;
- for(int i = 0; i < n; i++){
- printf("%d\n", i);
- switch(fork()){
- case -1:
- perror("err fork\n");
- exit(-1);
- break;
- case 0:
- wall(i, n);
- return 0;
- break;
- default:
- break;
- }
- }
- for(int i = 0; i < n; i++){
- wait(NULL);
- }
- free_shared(st);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement