Wpis na blogu utworzony przez Patryk Krawiec

Patryk Krawiec
Napisane przez: Patryk Krawiec (poniedziałek, 3 czerwca 2019, 15:04)
Wpis widoczny dla wszystkich

Dzien dobry dzisiaj mam dla was program konsumenta i producenta co razem naprzemiennie dobrami się wymieniają, proszę bardzo:)

Producent:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>

#define MAX 10
static struct sembuf buf;

void podnies(int semid, int semnum)
{<br />    buf.sem_num = semnum;<br />    buf.sem_op = 1;<br />    buf.sem_flg = 0;<br />    if(semop(semid, &buf, 1) == -1)<br />    {<br />        perror("Podnoszenie semafora");<br />        exit(1);<br />    }
}

void opusc(int semid, int semnum)
{<br />    buf.sem_num = semnum;<br />    buf.sem_op = -1;<br />    buf.sem_flg = 0;<br />    if(semop(semid, &buf, 1) == -1)<br />    {<br />        perror("Opuszczanie semafora");<br />        exit(1);<br />    }
}

int main(){<br />    int shmid, semid, i;<br />    int *buf;<br /><br />    semid = semget(45281, 2, IPC_CREAT|0600);<br />    if (semid == -1){<br />        perror("Utworzenie tablicy semaforow");<br />        exit(1);<br />        <br />    }
    if (semctl(semid, 0, SETVAL, (int)MAX) == -1){<br />        perror("Nadanie wartosci semaforowi 0");<br />        exit(1);<br />        <br />    }
    if (semctl(semid, 1, SETVAL, (int)0) == -1){<br />        perror("Nadanie wartosci semaforowi 1");<br />        exit(1);<br />    }
    shmid = shmget(45281, MAX*sizeof(int), IPC_CREAT|0600);
    
    if (shmid == -1){<br />        perror("Utworzenie segmentu pamieci wspoldzielonej");<br />        exit(1);<br />    }
    buf = (int*)shmat(shmid, NULL, 0);

    if (buf == NULL){<br />        perror("Przylaczenie segmentu pamieci wspoldzielonej");<br />        exit(1);<br />    }

    for (i=0; i<10000; i++){<br />        opusc(semid, 0);<br />        buf[i%MAX] = i;<br />        podnies(semid, 1);<br />        <br />    }    
    return 0;
}

Konsument:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>

#define MAX 10

static struct sembuf buf;

void podnies(int semid, int semnum)
{<br />    buf.sem_num = semnum;<br />    buf.sem_op = 1;<br />    buf.sem_flg = 0;<br />    if(semop(semid, &buf, 1) == -1)<br />    {<br />        perror("Podnoszenie semafora");<br />        exit(1);<br />    }
}

void opusc(int semid, int semnum)
{<br />    buf.sem_num = semnum;<br />    buf.sem_op = -1;<br />    buf.sem_flg = 0;<br />    if(semop(semid, &buf, 1) == -1)<br />    {<br />        perror("Opuszczanie semafora");<br />        exit(1);<br />    }
}

int main()
{<br />    int shmid, semid, i;<br />    int *buf;<br />    semid = semget(45281, 2, 0600);<br />    if (semid == -1){<br />        perror("Uzyskanie identyfikatora tablicy semaforow");<br />        exit(1);<br />        <br />    }
    
    shmid = shmget(45281, MAX*sizeof(int), 0600);
    
    if (shmid == -1){<br />        perror("Uzyskanie identyfikatora segmentu pamieci");<br />        exit(1);<br />    }
    buf = (int*)shmat(shmid, NULL, 0);

    if (buf == NULL){<br />        perror("Przylaczenie segmentu pamieci wspoldzielonej");<br />        exit(1);<br />    }

    for (i=0; i<10000; i++){<br />        opusc(semid, 1);<br />        printf("Numer: %5d Wartosc: %5d\n", i, buf[i%MAX]);<br />        printf("Wartość semafora 0: %d\n", semctl(semid, 0, GETVAL, 0));<br />        printf("Wartość semafora 1: %d\n", semctl(semid, 1, GETVAL, 0));<br />        podnies(semid, 0);<br />        <br />    }
    return 0;
}


I tak się życie kręci, dziękuję za czytanie i pozdrawiam.