#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <errno.h>
int id_semafor;
static void opusc_semafor(void)
{
struct sembuf bufor_sem;
bufor_sem.sem_num=0;
bufor_sem.sem_op=-1;
bufor_sem.sem_flg=SEM_UNDO;
int zmien_sem;
while (semop(id_semafor,&bufor_sem,1)) {
if (errno != EAGAIN && errno != EINTR) {
fprintf(stderr,"Blad opuszczania semafora- %s",strerror(errno));
exit(-5);
}
}
printf("\nSemafor zostal opuszczony.\n");
}
static void podnies_semafor(void)
{
int zmien_sem;
struct sembuf bufor_sem;
bufor_sem.sem_num=0;
bufor_sem.sem_op=1;
bufor_sem.sem_flg=SEM_UNDO;
while (semop(id_semafor,&bufor_sem,1)) {
if (errno != EAGAIN && errno != EINTR) {
fprintf(stderr,"Blad podnoszenia semafora- %s",strerror(errno));
exit(-5);
}
}
printf("\nSemafor zostal podniesiony.\n");
}
static void liczba_procesow_czekajacych()
{
int i;
if( (i = semctl(id_semafor, 0, GETNCNT))==-1) {
fprintf(stderr,"Blad odczytu liczby procesow czekajacych na podniesienie semafora",strerror(errno));
exit(-5);
}
else
printf("Liczba procesow czekajacych na podniesienie semafora: %d\n", i);
}
int main(int argc, char* argv[])
{
if(argc < 2) {
fprintf(stderr,"Za malo argumentow\nwywolaj program_glowny liczba_sk\n");
exit(1);
}
int liczba_sk;
//kontrola przekazanych argumentow do programu
if((liczba_sk = strtol(argv[1],NULL,10))<=0) {
fprintf(stderr,"Argument musi byc liczba dodatnia\n");
exit(1);
}
//tworzenie klucza
key_t klucz;
if(! (klucz = ftok(".",'A'))){
fprintf(stderr,"Blad tworzenia klucza /program_potomny");
exit(2);
}
//uzyskanie dostepu do semafora
if((id_semafor = semget(klucz, 1, 0600 ))==-1){
fprintf(stderr,"Blad uzyskania dostepu do semafora /program_potomny\n");
exit(3);
}
else
printf("Proces %d uzyskal dostep do semafora\n", getpid());
//dzialanie na semaforze
int i;
for(i=1;i<=liczba_sk; i++){
opusc_semafor();
printf("Sekcja krytyczna procesu: %d\n",getpid());
liczba_procesow_czekajacych(); //wypisanie liczby procesow czekajacych na
podnies_semafor();
}
return 0;
}
//sekcja krytyczna to to co wykonuje się od opuszczenia semafora do podniesienia... czyli wszystko to, co na żółto :)