#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/sem.h>
int main( void )
{
union semun //...tę strukturę musimy zdefiniować we własnym zakresie
{
int count; struct semid_ds *stats;
unsigned short int *array;struct seminfo *infos;
} control;
//...struktury wykorzystywane przez semop()
struct sembuf P0={ 0,-1,0 },V0={ 0,1,0 },Z0={ 0,0,0 };
struct sembuf P1={ 1,-1,0 },V1={ 1,1,0 },Z1={ 1,0,0 };
//...i cała reszta
key_t key; pid_t pid;
int semid,flag,nsems,step;
key=ftok( "/tmp", 'k'+'m' );flag=IPC_CREAT | S_IRUSR | S_IWUSR; nsems = 2;
semid = semget( key,nsems,flag );
control.count = 1; semctl(semid,0,SETVAL,control);
control.count = 5; semctl(semid,1,SETVAL,control); //czyli będzie 5 cykli
pid = fork(); //...uaktywniamy proces potomny
for( step=0;step<control.count;step++ )
{
if( !pid ) //...to wyłacznie dla potomka
{
printf( "[%u]...procesu potomny...start\n",(unsigned)getpid() );
semop( semid,&P0,1 ); //...ustawiamy semafor '0'
printf( "[%u]...krytyczna...start\n",(unsigned)getpid() );
sleep( 1 );
printf( "[%u]...krytyczna...stop\n",(unsigned)getpid() );
semop( semid,&V0,1 ); //...i zwalniamy semafor '0'
//...jeszcze zwiększymy o 1 wartość semafora 1,
// blokującego proces nadrzędny
semop( semid,&P1,1 ); //...zwiększamy wartość o '1' dla
printf( "[%u]...procesu potomny...stop\n\n",(unsigned)getpid() );
}
} //...no i załóżmy, że to wszystko, co miał zrobić potomek/potomkowie
/* Jeżeli pozostawimy ten fragment w komentarzu, to...
if( !pid )
{
printf( "[%u]...proces potomny zwalnia pamięć\n",(unsigned)getpid());
exit( 0 );
}
...potomek wykona i całą resztę kodu (kiedy zakończy pętlę)*/
semop( semid,&Z1,1); //...na tym semaforze zatrzymał się parent
//...przechodzi go w momencie kiedy, właściwą wartość ustawi potomek
printf( "[%u]...proces nadrzędny odzyskał sterowanie\n", (unsigned) getpid());
//...na koniec usuwany semafor z pomięci
semctl( semid,0x0,IPC_RMID );
return 0;
}