h>
#include
#include
h>
#include
#include
{
{
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
if( !pid ) //...to
{
printf(
{
printf(
else{ perror( "*** sem_getvalue()\t" ); }
if( !sem_close( id ) ){
sleep( 1 );
printf(
semop( semid,&V0,1 );
else{ perror( "*** sem_close()\t"
//...jeszcze zwiększymy o 1 wartość semafora 1,
// blokującego proces nadrzędny
semop( semid,&P1,1 );
/*...na wstępie pozostawmy te linie w komentarzu
if( !sem_unlink( name ) ){
printf(
else{ perror( "*** sem_unlink()\t" ); }
*/
}
/* 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;
}