#include #include #include #include #include union semun //...struktura potrzebna dla semctl() { int value; struct semid_ds *stat; unsigned short int *array; struct seminfo *info; }; int main( int argc,char** argv ) { key_t key; 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( "%s %s\n %s\n",argv[0],"[n]","n-krotność wykonania procesu" ); exit( 1 ); } sscanf( argv[1],"%d",&p ); //...jeżeli tak, to czytamy ilość powtórzeń 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