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.