Facebook
From Sloppy Finch, 3 Years ago, written in C#.
This paste is a reply to Re: Re: Re: Re: Re: Re: ss from Commodious Cat - go back
Embed
#include 
#include 
#include 
#include 
#include 
union semun //...struktura potrzebna dla semctl()
#include 
int main( void )
{
 int value; status;
key_t semkey; //... zmienne opisujące
int nsems,semflag,semid; // tworzoną tablicę semaforów
struct semid_ds *stat;
 unsigned short int *array; struct seminfo *info;
};
int main( int argc,char** argv 
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() 
)
{
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
{
case -1: //... obsługa błędu fork()
printf( "%s %s\n %s\n",argv[0],"[n]","n-krotność wykonania procesu" );
"!.!.!... 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 
);
printf( "[%u] semval=%d\n",(unsigned)getpid(),
semctl( semid,0,GETVAL ) );
semctl( semid,0x0,IPC_RMID); //... usuwamy semafory
}
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 {
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( " n=%d x=%f\n",n,x/(double)n ); fflush( stdout );
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
 return 0;
}

Replies to Re: Re: Re: Re: Re: Re: Re: ss rss

Title Name Language When
Re: Re: Re: Re: Re: Re: Re: Re: ss Melodic Octupus csharp 3 Years ago.