Facebook
From Smelly Gibbon, 3 Years ago, written in C#.
This paste is a reply to Re: Re: Re: ss from Denim Moth - go back
Embed
Viewing differences between Re: Re: Re: ss and Re: Re: Re: Re: ss
#include h> ...operacje wejścia/wyjścia
h>
#include 
#include 
#include h> ...maski uprawnień (choć niekonieczne)
h>
#include  ...stała OCREAT
#include  ...semafory POSIX, w ogólności (konieczne)

int main( int argc,char **argv void )
{
 sem_t *id; ...identyfikator tworzonego semafora\n int counter; ...licznik semafora (pomocniczo)\n char name[] = "km"; ...nazwa semafora (jeżeli nazwany, jakaś musi\nbyć)\nniektóre implementacje semaforów POSIX\nwymagają aby nazwa zaczynała się od '/',\nczyli będzie\nchar name[] = "km";\n counter = 7; ...inicjujemy zmienną dla licznika\n...spróbujmy w takim razie utworzyć/otworzyć semafor (nazwany)\nif((id=sem_open(name,O_CREAT,S_IRUSR|S_IWUSR,(unsigned)counter))!=SEM_FAILED)\nunion semun //...tę strukturę musimy zdefiniować we własnym zakresie
{
...jeżeli się udało, int count; struct semid_ds *stats;
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 ciąg dalszy
wyłacznie dla potomka
{
printf( "*** otwarto semafor\t%s\n",name "[%u]...procesu potomny...start\n",(unsigned)getpid() );
if( !sem_getvalue( id,&counter ) ) ...odczyt licznika
semop( semid,&P0,1 ); //...ustawiamy semafor '0'
printf( " licznik semafora\t%d\n",counter ); }
else{ perror( "*** sem_getvalue()\t" ); }
if( !sem_close( id ) ){ 
"[%u]...krytyczna...start\n",(unsigned)getpid() );
sleep( 1 );
printf( "*** zamknięto semafor\t%s\n",name "[%u]...krytyczna...stop\n",(unsigned)getpid() );
semop( semid,&V0,1 
); }
else{ perror( "*** sem_close()\t" 
//...i zwalniamy semafor '0'
//...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 ) ){ 
//...zwiększamy wartość o '1' dla
printf( "*** usunięto semafor\t%s\n",name ); }
else{ perror( "*** sem_unlink()\t" ); }
*/
"[%u]...procesu potomny...stop\n\n",(unsigned)getpid() );
}
else{ perror( "....sem_open()...." ); } ...cóż, gdyby coś poszło nie tak
} //...no i załóżmy, że to wszystko, co miał zrobić potomek/potomkowie
/* 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;
}

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

Title Name Language When
Re: Re: Re: Re: Re: ss Gracious Macaw csharp 3 Years ago.