#include
#include
#include
#include
{
int
key_t
int nsems,semflag,semid; // tworzoną tablicę semaforów
struct sembuf sems; //... struktura dla semop()
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()
if( argc>1 )
{
printf( "!.!.!... błąd fork()...!.!.!\n" ); exit( 1 ); break;
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
if( nsems>0 )
{
key = ftok( "/tmp",'a'+'t'+'h'+'r'+'i'+'r' );
printf(
(unsigned)getpid(),nsems,(unsigned)key );
semflag = IPC_CREAT | S_IRUSR | S_IWUSR;
semid = semget( key,nsems,semflag );
if( semid==-1 ){ perror( "\tsemget()..." ); exit( 3 ); }
else
{
if( semctl(
semctl( semid,0x0,IPC_RMID); //... usuwamy semafory
{ perror("\tsemctl()"); exit(1); }
}
else
{ printf( "\t%s [%s]\n%s",argv[0],"n",
"\tn -rozmiar tworzonej tablicy semaforów\n" ); exit( 1 ); }
return 0;