#include
#include
#include
#include
int main( void )
key_t semkey; //... zmienne opisujące
int nsems,semflag,semid; // tworzoną tablicę semaforów
struct
unsigned short int *array; struct seminfo *info;
};
int main( int argc,char** argv
nsems = 1; //... tworzymy tablicę semaforów, z jednym semaforem
semkey = ftok( "/tmp",'k'+'m' );
semflag = IPC_CREAT | S_IRUSR | S_IWUSR;
semid = semget( semkey,nsems,semflag );
sems.sem_num = 0; //... indeks do semafora, pierwszy=0 !
sems.sem_op = 7; //... może współdzielić 7 procesów
sems.sem_flg = 0x0; //... czyli z blokadą
semop( semid,&sems,nsems ); //... inicjujemy semafor
//... teraz pozostaje już tylko utworzyć proces potomny
switch( fork() )
{
int semid,flag;
struct sembuf P={ 0,-1,0}; //...żądanie dostępu {numer,operacja,flaga}
struct sembuf V={ 0,+1,0}; //...zwolnienie zasobu {numer,operacja,flaga}
union semun control;
int i,p,k,n;
double x;
if( argc<2 ) //...sprawdźmy, czy aby wywołanie jest poprawne
{
printf(
case 0: //... kod dla procesu potomnego
printf( "[%u] semval=%d\n",(unsigned)getpid(),
semctl( semid,0,GETVAL ) ); exit( 0 ); break;
default: //...kod dla procesu nadrzędnego
wait( &status );
printf( "[%u] semval=%d\n",(unsigned)getpid(),
semctl( semid,0,GETVAL ) );
semctl( semid,0x0,IPC_RMID); //... usuwamy semafory
}
key = ftok( "/tmp", 'k'+'m' ); flag = IPC_CREAT | S_IRUSR | S_IWUSR;
semid = semget( key,1,flag); //... tworzymy tablicę semaforów (pojedynczy)
control.value = 1; //...inicjowanie semafora (binarnego) wartością 1
semctl( semid,0x0,SETVAL,control );
switch( fork() ) //...utworzenie procesu potomnego
{
case -1: //...obsługa błędu fork
printf( "!.!.!...fork()...!.!.!\n" ); exit( 1 ); break;
case 0: //...kod dla procesu potomnego
printf( "...[%u]...proces potomny.......start\n",(unsigned)getpid());
fflush( stdout ); break;
default://...kod dla procesu macierzystego
printf( "...[%u]...proces macierzysty...start\n",(unsigned)getpid());
fflush( stdout ); break;
}
for( i=0;i {
semop( semid,&P,1 );
//...początek sekcji krytycznej
printf(" [%u]...rozpoczyna wykonywanie sekcji krytycznej\n",
(unsigned)getpid());
n = rand();
for( k=0,x=0;k
printf(" [%u]...kończy wykonywanie sekcji krytycznej\n",
(unsigned)getpid() );
//...koniec sekcji krytycznej
semop( semid,&V,1 );
}
semctl( semid,0x0,IPC_RMID,control ); //...usuwamy tablicę semaforów
}