#include
#include
#include
#include
int main( void )
{
union
{
int
unsigned short int
}
//...struktury wykorzystywane przez semop()
key_t key;
int flag,semid;
struct sembuf
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
key = ftok( "/tmp",'k'+'m' ); flag = IPC_CREAT | S_IRUSR |
semid = semget(
control.
sems.sem_num =
control.count
pid = fork(); //...uaktywniamy proces potomny
for( step=0;step
switch( (int)fork() )
{
{
printf( "[%u]...procesu potomny...start\n",(unsigned)getpid() );
case 0:
sems.sem_op =-1; semop(
printf( "[%u]...krytyczna...start\n",(unsigned)getpid() );
sleep( 1
printf(
sems.sem_op =+2; semop(
//...jeszcze zwiększymy o 1 wartość semafora 1,
// blokującego proces nadrzędny
break;
default:
sems.sem_op =-2; semop(
printf(
sems.sem_op =+1; semop( semid,&sems,1 );
break;
}
/* 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
return 0;
}